Так, чтобы это не показывало каталоги, которые содержат пустой файл, названный "0k", который я использую в качестве флага? Это кажется --exclude
не может иметь дело с этим.
du
может принять список файлов или каталогов от stdin (или достаточно новые версии могут, так или иначе). Таким образом, можно использовать find
и друзья, чтобы отфильтровать и предоставить этот список:
find Pictures -mindepth 2 -type d \( -execdir test -f '{}/0k' \; -o -print0 \) |
du --files0-from=- -h
-mindepth 2
, find
только перечислит каталоги (-type d
) по крайней мере два уровня глубоко (так Pictures/*/*
)find
будет работать test -f "{}/0k"
, который просто тестирует на существование названного файла 0k
. ({}
будет заменен find
с каталогом.) -o print0
).-o
работы, execdir
и -print0
потребность, которая будет сгруппирована с помощью (
, )
.du
затем возьмет эти имена каталогов и счастливо обеспечит использование диска.Сортировка:
find Pictures -mindepth 2 -type d \( -execdir test -f '{}/0k' \; -o -print0 \) |
du --files0-from=- -h |
sort -rh
Если Ваш пустой файл, действующий как флаг, называют 0k
, следующая команда считает все подкаталоги в текущем каталоге, которые не содержат файл. Можно, конечно, измениться .
в начале for
цикл, чтобы быть любым путем к каталогу.
for dir in ./*; do if [[ ! -f "$dir"/'0k' ]]; then du -s "$dir" ; fi ; done
Вы не упомянули в своем вопросе, нужно ли Вам это, чтобы быть совершенно рекурсивными, раз так это будет немного более сложно. Команда находки может использоваться здесь, поисковый каталог может быть изменен как выше:
find . -type d -exec bash -c 'if [[ ! -f "{}"/"0k" empty ]]; then du -s "{}"; fi' \;
Править: После разъяснения задачи от OP должна работать следующая команда.
for dir in Pictures/*/*; do if [[ ! -f "$dir"/'0k' ]]; then du -s "$dir" ; fi ; done | sort -nr | head -n50
#!/bin/bash
# Vars
NumLines="5" # output that many/few lines
MinSize=0 # filter out size folders lower than (MB)
while read DUout
do
# get folder size
Size="${DUout%%[[:space:]]*}"
# get folder path
Path="/${DUout#*/}"
# Filter out if no 0k flagfile inside
[[ ! -f "${Path}/0k" ]] && echo "${DUout}"|cut -d"/" -f1,5-6
done < <(du -s -t${MinSize}M "${PWD}"/????/??????\ * | sort -nr) | head -"${NumLines}"
Если каждая строка, которую Вы хотите исключить, содержит определенную строку (например, имя файла), то можно использовать grep
отфильтровать результаты du
.
Это использовалось бы в качестве так: du | grep -v -e "string_to_exclude"
. -v
аргумент в пользу grep
инвертирует вывод так, чтобы только несоответствия показали.