Сортировка файлов (в том числе в подкаталогах) по размеру, имени и размеру файла печати - PullRequest
0 голосов
/ 13 декабря 2018

Необходимо отсортировать файлы по размеру и распечатать только размер и имя файла (без пути).

Я попытался с помощью следующей команды добиться этого,

find.-тип f -exec du -h {} + |sort -r -h

Но это выводит результат, подобный этому,

6.0K ~/Documents/Folder/B/File2.txt

6.0K ~/Documents/Folder/KK/KB/File12.txt 

4.0K ~/Documents/Folder/A/File1.txt

Но я ожидаю, что вывод будет напечатан с именем файла без префикса каталога, как,

6.0K File2.txt

6.0K File12.txt

4.0K File1.txt

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

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018
Функция

find printf может сообщать размеры файлов во время поиска и имена без пути.Он может даже выполнять все виды форматирования для поддержки аккуратных столбцов, если хотите.

find $PWD -printf "%10.10s\t%f\n" | sort -n

% s - байты.% k будет указывать размер в КБ.

Это все на странице справки .

Я знаю, что это не то же самое, что вывод du -h, извините, но вы можете сэкономить тоннувремя, пропуская все эти вызовы процесса ....

0 голосов
/ 13 декабря 2018

Команда du выводит с \ t, так что вы можете использовать 2 разделителя (\t,/) в awk

> find . -type f -exec du -h {} + | sort -r -h | awk -F"[\t/]" ' { print $1,$NF } '
4.0K sameer.pkg
0 rem_col_rows.pl
0 rem_col_rows.dat
0 myfile
>

РЕДАКТИРОВАТЬ:

Чтобы получить как csv ...

> find . -type f -exec du -h {} + | sort -r -h | awk -F"[\t/]" ' { print $1,$NF } ' | tr ' ' ',' | tr '\n' ','
4.0K,sameer.pkg,0,skip_lines.txt,0,rem_col_rows.pl,0,rem_col_rows.dat,0,paras.txt,0,myfile,0,foo.yaml2,0,foo.yaml,

РЕДАКТИРОВАТЬ2

find . -type f -exec du -h {} + | sort -r -h | awk -F"[\t/]" ' { print $1,$NF } ' | tr ' ' ',' | tr '\n' ',' | sed 's/,$//g' 

РЕДАКТИРОВАТЬ3

> find . -type f -exec du -h {} + | sort -r -h | awk -F"[\t/]" ' { printf("%s,%s\n",$1,$NF) } '
4.0K,sameer.pkg
0,skip_lines.txt
0,rem_col_rows.pl
0,rem_col_rows.dat
0,paras.txt
0,myfile
0,foo.yaml2
0,foo.yaml
>
0 голосов
/ 13 декабря 2018

Вы можете попытаться выполнить это с помощью awk:

find . -type f -exec du -h {} + | sort -r -h | awk '{sub(".*\/","",$2)}1'

Это просто сохранит последнее слово после /

awk, в вашем случае строки разделяются пробелами:

$1         $2    

6.0K      ~/Documents/Folder/B/File2.txt

6.0K      ~/Documents/Folder/KK/KB/File12.txt 

4.0K      ~/Documents/Folder/A/File1.tx

Итак, если вы хотите сохранить первый столбец, просто примените регулярное выражение (.*\/) ко второму столбцу.Это регулярное выражение соответствует всему, вплоть до косой черты (я использую \/, потому что вам нужно экранировать /).Затем я заменяю это регулярное выражение на '' (удаляет его в основном).

...