Как отфильтровать вывод du?

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

0
задан 12 July 2017 в 05:31

4 ответа

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

Сортировка:

find Pictures -mindepth 2 -type d \( -execdir test -f '{}/0k' \; -o -print0 \) |
  du --files0-from=- -h |
  sort -rh
2
ответ дан 2 November 2019 в 22:44

Если Ваш пустой файл, действующий как флаг, называют 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
1
ответ дан 2 November 2019 в 22:44
#!/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}"
1
ответ дан 2 November 2019 в 22:44

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

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

0
ответ дан 2 November 2019 в 22:44

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

Похожие вопросы: