Команда du - показать файл или папку в выводе?
Если я запускаю команду du -ah | sort -nr Можно ли заставить его показать, какая строка на выходе является файлом и в какой папке? Что-то вроде команды ls -l показывает, что файл и папка с d а также - спереди.
2 ответа
Это возможно, но не без помощи другой команды. В частности, здесь мы используем GNU awk (это важно, поэтому проверьте свою версию awk)
$ du -ah | sort -nr | awk '{usage=$1; $1="";cmd="file "$0;cmd |& getline type;print usage,type ;close(cmd)}'
24K .: directory
4.0K ./testdir: directory
4.0K ./out.txt: ASCII text
4.0K ./3.txt: ASCII text
4.0K ./2.txt: ASCII text
4.0K ./1.txt: ASCII text
Конечно, этот подход немного ошибочен, так как кажется, что он не работает с именами файлов, которые содержат пробелы (все еще работает над его улучшением)
В качестве альтернативы мы также можем использовать find Команда найти все файлы и запустить file а также du команды, чтобы сделать наши торги через -exec флаг, но это выглядит немного некрасиво (см. историю редактирования). Мы могли бы, однако, использовать find"s -printf флаг для печати типа файла с %y формат для более красивого вывода.
$ find -mindepth 1 -printf "%y\t" -exec du "{}" \; | sort -rn
f 4 ./out.txt
f 4 ./3.txt
f 4 ./2.txt
f 4 ./1.txt
f 0 ./with space.txt
d 4 ./testdir
Очевидно здесь f для обычного файла и d для каталога. Увидеть findруководство для получения дополнительной информации о флагах и типах букв
Как говорит Серг, du не могу сделать это самостоятельно. Для безопасной обработки имен файлов лучше всего разделить их символом ASCII nul (\0), а также du могу сделать это. Таким образом, используя это, наряду с sort а также xargs 'возможность обрабатывать ввод с нулевым разделением:
du -0ah |
sort -zh |
xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _
-0, -z а также -0 варианты рассказывают du, sort а также xargs использовать ASCII nul в качестве разделителя.
Затем, s=${i%[[:space:]]*} чтобы получить начало строки до пробела (который является размером), и f=${i#*[[:space:]]} чтобы получить все остальное (имя файла). Тогда мы получим ls напечатать имя файла с украшением.
Пример:
$ du -0ah Screenshots | sort -zh | xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _
512 Screenshots/desktop.ini*
264K Screenshots/Screenshot (1).png*
269K Screenshots/
Потому что я использовал ls --color Я также получаю хороший вывод цвета:
