Кажется, что применив решение из https://unix.stackexchange.com/a/307498/111048(, которое обрабатывает выключение ), моя проблема также решена!
du
не обрабатывает поток текста, ему нужен список имен файлов. Это означает, что вы не можете просто передать ему поток текста, даже если этот поток содержит имена файлов, потому что он не может его прочитать. Итак, у вас есть два основных варианта: :i )использовать инструмент xargs
, который предназначен именно для таких вещей, или ii )прочитать имена файлов в цикле и передать их du
. Из двух, xargs
является самым простым :
find -name '.stversions' | xargs du -hd1 | sort -h
Однако этот подход не работает, если какой-либо из ваших путей содержит пробельные символы. Более надежным решением был бы ответ Роаймы или, альтернативно, использование инструментов GNU :
.find -type d -name '.stversions' -print0 | xargs -0 du -hd1 | sort -h
Стандартная команда du
не ожидает ввода от stdin , поэтому передача в нее не будет иметь никакого эффекта. (Он также не обрабатывает -h
или -d1
. )Версия GNU будет принимать разделенный NUL -список файлов (см.man du
).
Если вы собираетесь использовать GNU du
, вы также можете использовать записи с завершением NUL -во всем конвейере, что будет соответствовать именам файлов (именам каталогов ), содержащим неожиданные символы, включая пробелы.
find -type d -name '.stversions' -print0 | du -h -d1 --files-from0 - -0 | sort -z -h | tr '\0' '\n'