2015-07-30 2 views
3

Я хотел бы настроить вывод: выходформатирования дю -sh выход

du -hs * 

Например:

23G Test1 
1.2M Folder With Spaces 
12G Another Folder With Spaces 

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

du -hs * | awk '{print $1 " " $2;}' 

Вышеприведенные возвращает это:

23G Test1 
1.2M Folder 
12G Another 

EDIT: Решение заключается в добавлении -F и указать вкладки разделитель:

du -hs * | awk -F'\t' '{print $1 " " $2;}' 

Вкладки также являются допустимыми символами в файлы/папки. В моем случае это никогда не будет проблемой.

+0

Не рекомендуется создавать файлы и каталоги с пробелами в их именах. С другой стороны, это еще лучшая идея, позволяющая справляться с существующими файлами и каталогами с пробелами (и другими забавными символами) в их именах. –

+0

Я не согласен. Вы должны всегда проверять специальные случаи, если вы на 100% не уверены, что файлы и папки, на которые вы запрашиваете, не содержат пробелов. – mac2017

+0

Я думаю, вы неправильно читаете мой комментарий. –

ответ

3

Для моего du (GNU coreutils) размер и имя файла разделяются вкладкой. Таким образом, имя может быть восстановлена ​​путем удаления все, вплоть до и включая первую вкладку:

du -hs * | awk '{size=$1; name=$0; sub(/[^\t]*\t/, "", name); print name}' 

ПРИМЕЧАНИЕ: Вышеуказанный подведет, если имена файлов содержат символы новой строки. В зависимости от того, какую операционную систему вы используете, могут быть способы ограничения этого ограничения. Например, на Linux (GNU инструменты), du может производить NUL-отделенных записи, которые GNU AWK (простак) может читать и интерпретировать:

du -0hs * | awk -v RS='\0' '{size=$1; name=$0; sub(/[^\t]*\t/, "", name); print "NAME="name}' 
2

Как du использует вкладки в то время как ваши имена файлов не должны содержать вкладки или новые строки , вы можете просто использовать cut (с вкладкой разделителя по умолчанию).

du -hs * | cut -f1 # First field 
du -hs * | cut -f2 # Second field 
du -hs * | cut -f2- # All fields >= 2 (if there are tabs in the filename) 

Если вам нужно awk для дальнейшей обработки, это должно быть достаточно.

+0

'-f2-' будет немного лучше, поскольку он охватывает маловероятный случай, когда имя файла содержит один или несколько символов табуляции. (Конечно, новые символы в именах файлов будут разбиты). – rici