Как перечислить файлы из n самых больших каталогов?

Я интересуюсь нахождением n самые большие подкаталоги (например, 3) в моем текущем каталоге И ЗАТЕМ списке всех файлов от них. Я не интересуюсь нахождением самых больших файлов. Я знаю, что существует много решений для нахождения самых больших файлов, и это не то, что я хочу.

Я нашел свои 3 самых больших подкаталога со строкой:

$ du -hs */ | sort -rh | head -3

с результатом:

212K    04/
52K     02/
20K     03/

но так или иначе я не могу перечислить файлы из этих каталогов (передающий по каналу с ls, не работал). Какие-либо предложения, как сделать это?

5
задан 29 March 2017 в 06:00

2 ответа

Можно использовать результаты переданных по каналу команд с некоторое время циклом:

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, для обработки имен файлов с пробелами и специальными символами более устойчивым способом.

6
ответ дан 23 November 2019 в 08:51

Замена команды, со справкой от 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 {}
4
ответ дан 23 November 2019 в 08:51

Другие вопросы по тегам:

Похожие вопросы: