команда du - показывает файл или папку в выводе?

Если я выполняю команду du -ah | sort -nr действительно ли возможно заставить его показать, какая строка в выводе является файлом и который папка? Что-то как команда ls -l шоу, который является файлом и папкой с d и - впереди.

4
задан 31 December 2016 в 06:17

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

8
ответ дан 23 November 2019 в 11:39

Как 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, я также получаю хороший вывод цвета:

enter image description here

6
ответ дан 23 November 2019 в 11:39

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

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