2015-11-14 5 views
0

На моей FreeBSD 10.1 Я пишу маленький кусочек кода, который в основном вызывает ls и автоматически разбивает результаты вниз на что-то вроде этого:Печать этикеток с использованием AWK

directory: 
    2.4M .git 
    528K src 
    380K dist 
    184K test 
file: 
    856K CONDUCT.md 
    20K README.md 
........ 

Вам только нужно будет перечислить каталоги и обычные файлы, и вам не нужно указывать ..., но вы должны перечислять скрытые файлы и сортировать их от самых больших до небольших по отдельности.

Задача состоит в том, чтобы завершить это как команду одной строки без использования$(cmd), &&, ||, >, >>, <, ;, & и в течение 12 труб (обратные кавычки рассчитывать, а).

В настоящее время мой прогресс:

ls -Alh | sort -d -h -r | 
awk 'BEGIN {print "Directories:"} 
     NR>1 {if(substr($1,1,1)~"d")print"  "$5"  "$9}' 

, который не печатает только до последнего пункта каталога. Но так как вся команда будет выводиться после каждой записи, я не могу найти способ распечатать files: только один раз, а затем распечатать оставшийся вывод.

+1

Опция '-h' для сортировки находится в GNU и FreeBSD' sort', но не в Mac OS X 'sort' (что интересно, потому что это происходит от BSD). Размеры каталогов меня интригуют: в Mac OS X каталоги возвращаются с небольшими номерами (длина имен в каталоге плюс некоторые накладные расходы для каждого имени), а не дисковое пространство, используемое содержимым. Определяет ли FreeBSD 'ls' размер содержимого каталогов? Или вам нужно использовать 'du -s -h', чтобы получить их? (У меня есть несколько кириллических файлов UTF-8 в каталоге, в котором я играю, и 'sort -d -r' зажимает их, если не задано значение« LC_ALL = C ».) –

ответ

0

Ну, вы, возможно, придется хранить файлы в массиве и печати в конце:

ls -Alh|sed 1d| 
    sort -h -k5r| 
    awk 'BEGIN {print "Directories:"} 
     /^d/{print "\t"$5"\t"$9} 
     /^-/{f[n++]=sprintf("\t"$5"\t"$9)} 
     END{print "Files:"; 
     for(i=0;i<n;++i)print f[i]}' 

Еще одна проблема, которую вы должны будете работать: файлы и каталоги могут иметь пробелы в имени, и простой $9 будет недостаточным для этого случая.

Смежные вопросы