Как отфильтровать выходные данные?

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

4 ответа

Решение

du может принять список файлов или каталогов из стандартного ввода (или достаточно новые версии могут, в любом случае). Так что вы можете использовать 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 с каталогом.)
    • Если тест пройден успешно, ничего не происходит. Если нет, путь к каталогу печатается с ASCII NUL в конце (-o print0).
    • Путь -o работает, execdir а также -print0 нужно сгруппировать с помощью (, ),
  • du затем возьмет эти имена каталогов и с радостью предоставит использование диска.

Сортировка:

find Pictures -mindepth 2 -type d \( -execdir test -f '{}/0k' \; -o -print0 \) |
  du --files0-from=- -h |
  sort -rh
#!/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}"

Если ваш пустой файл, действующий как флаг, называется 0kследующая команда прочитает все подкаталоги в текущем каталоге, которые не содержат файл. Вы, конечно, можете изменить . в начале for цикл, чтобы быть любым путем к каталогу.

for dir in ./*; do if [[ ! -f "$dir"/'0k' ]]; then du -s "$dir" ; fi ; done

Вы не упомянули в своем вопросе, нужно ли это быть полностью рекурсивным, если это так, то это будет немного сложнее. Здесь можно использовать команду find, каталог поиска можно изменить, как указано выше:

find . -type d -exec bash -c 'if [[ ! -f "{}"/"0k" empty ]]; then du -s "{}"; fi' \;

Изменить: После прояснения задачи из ОП, должна работать следующая команда.

for dir in Pictures/*/*; do if [[ ! -f "$dir"/'0k' ]]; then du -s "$dir" ; fi ; done | sort -nr | head -n50

Если каждая строка, которую вы хотите исключить, содержит определенную строку (например, имя файла), тогда вы можете использовать grep отфильтровать результаты du,

Это будет использоваться так: du | grep -v -e "string_to_exclude", -v аргумент в пользу grep инвертирует вывод, так что отображаются только несоответствия.

Другие вопросы по тегам