Как отфильтровать выходные данные?
Чтобы не отображались каталоги, содержащие пустой файл с именем "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нужно сгруппировать с помощью(,),
- Если тест пройден успешно, ничего не происходит. Если нет, путь к каталогу печатается с ASCII NUL в конце (
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 инвертирует вывод, так что отображаются только несоответствия.