Как получить размер папки с помощью AWK? - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь получить все пути и общий размер папки, используя AWK;Мой первый подход заключается в использовании этого сценария:

BEGIN { OFS=" " }
sub(/^\\/,"/") { path = $0; next }
path == "" { next }
match($0,/^(.*[^ ]) +A +([^ ]+) +(.*)/,a) { print substr(path,2) "\\ " a[2] }

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

Так вот мой ввод:

README.txt         A  45  Mon Aug 30 18:50:16 2018        
Test Cases.xlsx         A  1415577  Wed Aug 29 14:00:16 2018
\Qt Database EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl
R0097A+05.00B-00-QingL.JPG          A  6958377  Fri Jun  8 12:53:30 2018
R0097A+05.00B-00-QingLI.JPG         A  2794933  Fri Jun  8 12:53:30 2018
R0097A-00.00B-00-QingLI.JPG         A  2825705  Fri Jun  8 12:53:30 2018
R0097A-00.00B-00-QingLO.JPG         A  1369520  Fri Jun  8 12:53:30 2018
Thumbs.db                           A    20480  13969015Fri Jun  8 13:14:41 2018
\QJ Database EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl
R0098A+05.00B-00-QingL.JPG          A  6958377  Fri Jun  8 12:54:30 2018
R0098A-00.00B-00-QingLO.JPG         A  1369520  Fri Jun  8 12:54:30 2018
Thumbs.db                           A    20480  Fri Jun  8 13:14:41 2018

И мой вывод должен быть примерно таким:

\Qt Database EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl,13969015 
\QJ Database EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl,8348377 

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Зачем бороться с «awk» за это, когда вы можете просто использовать «du»?

du -sh <dir_name>
0 голосов
/ 01 февраля 2019

Вот рефакторинг, который, кажется, делает то, что вы хотите.

BEGIN { OFS="," }
/^\\/ { if(path) print path, sum; path = $0; sum = 0; next }
path == "" { next }
match($0,/^(.*[^ ]) +A +([^ ]+) +(.*)/,a) { sum+= a[2] }
END { if(path) print path, sum }'

Хитрость состоит в том, чтобы собирать вещи и печатать результат из этого, когда коллекция завершена.(Распространенная ошибка новичка - забыть напечатать последнюю коллекцию. Повторять один и тот же код в END - это немного бородавки - если бы он был более сложным, я бы добавил это в функцию.)

Похоже, вы хотите вывод через запятую, поэтому мы устанавливаем OFS для этого.

Для трех аргументов match() требуется GNU Awk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...