2015-11-29 2 views
-1

Я пытаюсь подсчитать размер всех файлов и подкаталогов, начиная с ./ использованием Oneliner:Bash - Отфильтровать каталоги из вывода ls -la, но оставить каталог "."

ls -laR | grep -v "\.\." | awk '{total += $5} END {print total}' 

, но это считается размер подкаталогов в два раза, потому что выход ls -laR | grep -v "\.\." является:

.: 
total 32 
drwxr-xr-x 3 root root 4096 Nov 29 22:59 . 
-rw-r--r-- 1 root root 55 Nov 29 02:19 131 
-rw-r--r-- 1 root root 50 Nov 29 01:28 abc 
-rw-r--r-- 1 root root 1000 Nov 29 01:27 access.log 
drwxr-xr-x 2 root root 4096 Nov 29 22:24 asd 
-rwx------ 1 root root 458 Nov 29 02:54 oneliners.sh 
-rwx------ 1 root root 2136 Nov 29 17:56 regexp.sh.skript 

./asd: 
total 32 
drwxr-xr-x 2 root root 4096 Nov 29 22:24 . 
-rw-r--r-- 1 root root 21298 Nov 29 22:26 asd 

так считает каталог дважды. один раз в листинг каталога .: как:

drwxr-xr-x 2 root root 4096 Nov 29 22:24 asd 

и 2-й раз в листинг каталога ./asd: как:

drwxr-xr-x 2 root root 4096 Nov 29 22:24 . 

я ожидаю, что это произойдет в каждом подкаталоге. Есть ли способ удалить их один раз с ls вывода? Usint grep -v '^d' удаляет все каталоги, поэтому их вообще не учитывают. Я знаю, что могу сделать это просто bu, используя du -sb, но мне нужно, чтобы это было сделано с помощью fancy oneliner.

+1

huh? что случилось с 'du'? –

+0

НЕ анализируйте вывод ls. ™ – 4ae1e1

+2

_but Мне нужно, чтобы это было сделано с помощью fancy oneliner_. Разве это не 'du -sh' oneliner? – alvits

ответ

0
ls -FlaR |grep -v '\s\.\{1,\}/$' |awk '{total += $5} END {print total}' 

содержит размер папок внутри '.', Но не размер '.' сам. Сравнивая с du, ответ совершенно по-разному: du - это пространство на диске (относится к блокам). Ответ я получаю с помощью AWK сценария ближе к тому, что отчеты OS -Если вы вычитать каталог размеров вы получаете матч, который предполагает, что MacOS X использует метод, аналогичный

ls -FlaR |grep -v '^d.*/$' |awk '{total += $5} END {print total}' 

для расчета размера содержимое папки.

+0

Спасибо за помощь. Это было домашнее задание сделать oneliner, чтобы считать пространство, как 'du-sb .', но сделать это в фантастическом ключе. после прочтения всего этого получилось: 'find -ls | tr -s "" | sed -e 's/^ [\ t] * //' | cut -d "" -f 7 | awk '{total + = $ 1} END {print total}' ' –

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