Я интересуюсь нахождением n самые большие подкаталоги (например, 3) в моем текущем каталоге И ЗАТЕМ списке всех файлов от них. Я не интересуюсь нахождением самых больших файлов. Я знаю, что существует много решений для нахождения самых больших файлов, и это не то, что я хочу.
Я нашел свои 3 самых больших подкаталога со строкой:
$ du -hs */ | sort -rh | head -3
с результатом:
212K 04/
52K 02/
20K 03/
но так или иначе я не могу перечислить файлы из этих каталогов (передающий по каналу с ls, не работал). Какие-либо предложения, как сделать это?
Можно использовать результаты переданных по каналу команд с некоторое время циклом:
du -hs */ | sort -rh | head -3 | while read -r size dir
do
ls -l "$dir"
done
Как один лайнер:
du -hs */ | sort -rh | head -3 | while read -r size dir ; do ls -l "$dir"; done
Благодаря steeldriver для предложения использования read
в while
цикл по for
цикл с помощью awk
, для обработки имен файлов с пробелами и специальными символами более устойчивым способом.
Замена команды, со справкой от awk
для получения первым 3 каталога:
ls -l $(du -hs */ | sort -rh | awk 'NR==4{exit} {print $2}')
Принятие никакого имени каталога содержит любой пробел или любой необычный символ.
Устойчивый подход: обработка любого возможного файла (каталог) имя, вывод имени каталога как NUL, разделенный в awk
и взятие справки от xargs
для контакта с каждым каталогом:
du -0hs */ | sort -zrh | awk 'BEGIN{RS="\0"} NR==4{exit} {printf("%s\0", $2)}' | \
xargs -0 ls -l
Каждое содержание каталога за один раз:
du -0hs */ | sort -zrh | awk 'BEGIN{RS="\0"} NR==4{exit} {printf("%s\0", $2)}' | \
xargs -0 -I{} ls -l {}