2014-01-24 2 views
2

Я придумал команду для поиска файлов и печати их размеров с помощью find, xargs и du. У меня проблема, когда я ищу что-то, чего не существует. Используя метод xargs, du сообщает обо всех папках, когда чего-то не существует, но я ожидаю, что он ничего не сообщит, потому что ничего не должно быть найдено. При использовании метода -exec он работает правильно, но из того, что я читал и наблюдал в больших поисковых запросах, он менее эффективен, поскольку он повторяет команду du для каждого найденного файла, а не работает в группе найденных файлов. См. Раздел, где упоминается -delete: http://content.hccfl.edu/pollock/unix/findcmd.htmТрубопровод пустой результат поиска до дюрала xargs приводит к неожиданному поведению

Вот пример. Во-первых, это то, что в каталогах:

ls
bar_dir/ test1.foo test2.foo test3.foo

ls bar_dir
test1.bar test2.bar test3.bar

Вот два поиска, где я ожидаю, чтобы найти результаты:

find . -name '*.foo' -type f -print0 | xargs -0 du -h
4.0K ./test2.foo
4.0K ./test1.foo
4.0K ./test3.foo

find . -name '*.bar' -type f -print0 | xargs -0 du -h
4.0K ./bar_dir/test1.bar
4.0K ./bar_dir/test2.bar
4.0K ./bar_dir/test3.bar

Здесь это поиск, в котором я не ожидаю результатов, но вместо этого я получить список каталогов:

find . -name '*.qux' -type f -print0 | xargs -0 du -h
16K ./bar_dir
32K .

Если я просто использовать найти, она ничего не возвращает (как и ожидалось)

find . -name '*.qux' -print0

И если я использую -exec метод дю, он также ничего не возвращает (как и ожидалось)

find . -name '*.qux' -type f -exec du -h '{}' \;

так что это дело с помощью метода xargs du, когда find ничего не находит? Спасибо за ваше время.

ответ

0

Вы посмотрели на du --files0-from -?

От man du

--files0-from=F 
      summarize disk usage of the NUL-terminated file names specified in file F; If F is - then read names from standard input 

Попробуйте так:

find . -name '*.qux' -type f -print0 | du -h --files0-from - 
+0

Это работает с небольшим редактирования ... Добавить пробел между '-i' и' {} ' : 'найти. -name '* .qux' -type f -print0 | xargs -0 -I {} du -h {} 'Спасибо! В качестве побочного примечания я попробовал свой исходный код без '-print0' и' -0', и каталоги все еще были возвращены. Этот код: 'find. -name '* .qux' -type f -print | xargs du -h' все еще не работает. –

+0

@mixed_signals: Извините, пост отредактирован для лучшего решения IMO – grebneke

+0

Это также работает: 'find. -name '* .qux' -type f -print0 | du -h -files0-from -' Я прочитаю эти два решения. Еще раз спасибо! –

Смежные вопросы