Если я выполняю команду du -ah | sort -nr
действительно ли возможно заставить его показать, какая строка в выводе является файлом и который папка? Что-то как команда ls -l
шоу, который является файлом и папкой с d
и -
впереди.
Это - вид возможных, но не без помощи другой команды. А именно, здесь мы используем 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
-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
руководство для большего количества информации о флагах и буквах типа файла
Как Serg говорит, 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
, я также получаю хороший вывод цвета: