2013-12-09 2 views
0

Я делаю небольшой скрипт на bash, который показывает общий размер в мб, количество файлов, номер папки и имя папки. У меня есть почти все, кроме размера в мегабайтахполучить размер и другую информацию с помощью команды «du»

du -a -h | cut -d/ -f2 | sort | uniq -c 

Это показывает, что-то вроде этого:

4 01 folder 01 
    6 02 folder 02 
11 03 folder 03 
13 04 folder 04 
16 05 folder 05 
..... 
15 13 folder 13 
    1 5.7G . 

, как вы видите, сортировка: количество файлов, количество папок и имя.

Я хочу это:

300M 4 01 folder 01 
    435M 6 02 folder 02 
    690M 11 03 folder 03 
    780M 13 04 folder 04 
    1.6G 16 05 folder 05 
..... 
15 13 folder 13 
    1 5.7G . 

спасибо заранее.

PD есть способ показать имя над каждым столбцом, как это?

M F # name 
    300M 4 01 folder 01 
    435M 6 02 folder 02 
    690M 11 03 folder 03 
    780M 13 04 folder 04 
    1.6G 16 05 folder 05 
..... 
15 13 folder 13 
    1 5.7G . 
+2

«есть способ показать имя над каждым столбцом, как это?» Да, используйте 'echo'. –

+0

Покажите код, а не только один вкладыш, который вы уже там разместили. –

+0

единственный код у меня есть du -a -h | cut -d/-f2 | сортировать | uniq -c –

ответ

3

Как насчет этого? Выход

echo -e "Size\tFiles\tDirectory"; paste <(du -sh ./*/ | sort -k2 | cut -f1) <(find ./*/ | cut -d/ -f2 | uniq -c | sort -k2 | awk '{print ($1-1)"\t"$2}') | sort -nk2 

Пример:

Size Files Directory 
172M 36  callrecords 
17M  747  manual 
83M  2251 input 
7.5G 16867 output 

Пояснение:

Добавьте заголовок:

echo -e "Size\tFiles\tDirectory"; 

< (КОМАНДА) представляет собой структуру, которая позволяет вывод команды для использования, как если бы это был файл. Paste принимает 2 файла и выводит их бок о бок. Поэтому мы вставляем результаты двух команд. Первый заключается в следующем:

<(du -sh ./*/ | sort -k2 | cut -f1) 

который просто находит размер подпапок текущей папки, суммируя что-либо внутри. Затем это сортируется в соответствии с именами файлов/папок, а затем выполняется первый столбец. Это дает нам список размеров подпапок текущей папки, отсортированных по их имени.

Вторая команда это:

<(find ./*/ | cut -d/ -f2 | uniq -c | sort -k2 | awk '{print ($1-1)"\t"$2}') 

Это похоже на исходную команду - он находит папки ниже текущей директории, обрезает имена включить только первый подуровень, то считает их дать список из подпапок текущей папки и количества файлов в каждой. Затем это сортируется по именам папок, и команда awk форматирует результаты, а также вычитает 1 из количества файлов для каждой папки (поскольку сама папка включена). Затем мы можем вставить результаты вместе, чтобы получить (почти) окончательный результат.

Наконец, мы используем sort -nk2 на выходе команды paste для сортировки по числу во втором поле - то есть в количестве файлов.

+0

да! это в основном то, что я хочу! Большое спасибо, и это очень полезно для объяснения! –

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