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

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

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

9 ответов

Если ваш пустой файл, действующий как флаг, называется 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' \;

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

for dir in Pictures/*/*; do if [[ ! -f "$dir"/'0k' ]]; then du -s "$dir" ; fi ; done | sort -nr | head -n50
1
ответ дан 22 May 2018 в 20:38
  • 1
    Да, рекурсивный, как du. Извините, я не сказал цели: мне нужно найти самый большой субдилер (ы), находящийся в Pictures / YYYY /. Поддиры имеют имя YYYYMM [DD[-DD]] Blahblah, а blahblah может содержать обычные символы, такие как одиночная кавычка, но я могу легко воздерживаться от использования косой черты, котировки назад, $ или около того. Когда содержимое YYYYMM ... subdir было проверено, это означает, что в нем нет никакого субдиректа, и я сбросил в него файл с именем 0k (zerok, чтобы он показывал сверху по умолчанию ls или nautilus или так, поскольку все остальные файлы в нем - yyyymmdd_hhmmss-SomeText.ext, относится к exiftool). – useful 12 July 2017 в 16:26
  • 2
    du ????/??????\ *|sort -rn|head -n50 или -n20 ... отлично подходит для этого, за исключением того, что он не может отфильтровать уже очищенные каналы. Я попробовал добавить материал |cut..., чтобы передать счастливые несколько dirs через фильтр, который удалит все, содержащие 0k-файл. – useful 12 July 2017 в 16:26
  • 3
    Я имел в виду удаление из списка, а не с диска;) – useful 12 July 2017 в 16:50
  • 4
    Хорошо, поэтому интересующие вас субдиры находятся на двух уровнях от «Картинки» в разных каталогах «YYYY». Я думаю, что будет изменена первая команда, я отредактирую предлагаемое изменение. – Arronical 12 July 2017 в 18:20
[F1]
1
ответ дан 22 May 2018 в 20:38

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

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

0
ответ дан 22 May 2018 в 20:38
  • 1
    Хорошее мышление, но я думаю, что они хотят исключить весь каталог, если он содержит специально названный пустой файл. Мы не узнаем, пока ОП ответит на вопросы. Это просто исключает вывод размера самого файла. – Arronical 12 July 2017 в 14:18
  • 2
    Да Арроничный, ты прав. Я использую du ????/??????\ *|sort -rn|head -n50|cut -f1 --complement в качестве входных данных для xargs, чтобы попытаться отфильтровать выход du, чтобы dirs, содержащие обычный файл 0k, не отображались. (????/??????\ * - это имена изображений с именами YYYY \ YYYYMM blahblah) – useful 12 July 2017 в 14:56
  • 3
    @useful Я придумал ответ, это имя файла флага 0k или это размер? – Arronical 12 July 2017 в 14:58
  • 4
    @ Акрологический: оба – useful 12 July 2017 в 15:30

Если ваш пустой файл, действующий как флаг, называется 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' \;

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

for dir in Pictures/*/*; do if [[ ! -f "$dir"/'0k' ]]; then du -s "$dir" ; fi ; done | sort -nr | head -n50
1
ответ дан 18 July 2018 в 10:24

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

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

0
ответ дан 18 July 2018 в 10:24
[F1]
1
ответ дан 18 July 2018 в 10:24

Если ваш пустой файл, действующий как флаг, называется 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' \;

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

for dir in Pictures/*/*; do if [[ ! -f "$dir"/'0k' ]]; then du -s "$dir" ; fi ; done | sort -nr | head -n50
1
ответ дан 24 July 2018 в 19:34
  • 1
    Да, рекурсивный, как du. Извините, я не сказал цели: мне нужно найти самый большой субдилер (ы), находящийся в Pictures / YYYY /. Поддиры имеют имя YYYYMM [DD[-DD]] Blahblah, а blahblah может содержать обычные символы, такие как одиночная кавычка, но я могу легко воздерживаться от использования косой черты, котировки назад, $ или около того. Когда содержимое YYYYMM ... subdir было проверено, это означает, что в нем нет никакого субдиректа, и я сбросил в него файл с именем 0k (zerok, чтобы он показывал сверху по умолчанию ls или nautilus или так, поскольку все остальные файлы в нем - yyyymmdd_hhmmss-SomeText.ext, относится к exiftool). – useful 12 July 2017 в 16:26
  • 2
    du ????/??????\ *|sort -rn|head -n50 или -n20 ... отлично подходит для этого, за исключением того, что он не может отфильтровать уже очищенные каналы. Я попробовал добавить материал |cut..., чтобы передать счастливые несколько dirs через фильтр, который удалит все, содержащие 0k-файл. – useful 12 July 2017 в 16:26
  • 3
    Я имел в виду удаление из списка, а не с диска;) – useful 12 July 2017 в 16:50
  • 4
    Хорошо, поэтому интересующие вас субдиры находятся на двух уровнях от «Картинки» в разных каталогах «YYYY». Я думаю, что будет изменена первая команда, я отредактирую предлагаемое изменение. – Arronical 12 July 2017 в 18:20

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

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

0
ответ дан 24 July 2018 в 19:34
  • 1
    Хорошее мышление, но я думаю, что они хотят исключить весь каталог, если он содержит специально названный пустой файл. Мы не узнаем, пока ОП ответит на вопросы. Это просто исключает вывод размера самого файла. – Arronical 12 July 2017 в 14:18
  • 2
    Да Арроничный, ты прав. Я использую du ????/??????\ *|sort -rn|head -n50|cut -f1 --complement в качестве входных данных для xargs, чтобы попытаться отфильтровать выход du, чтобы dirs, содержащие обычный файл 0k, не отображались. (????/??????\ * - это имена изображений с именами YYYY \ YYYYMM blahblah) – useful 12 July 2017 в 14:56
  • 3
    @useful Я придумал ответ, это имя файла флага 0k или это размер? – Arronical 12 July 2017 в 14:58
  • 4
    @Arronical : оба – useful 12 July 2017 в 15:30
[F1]
1
ответ дан 24 July 2018 в 19:34
  • 1
    Этот выглядит как элегантный кандидат на один лайнер, но, похоже, тест не работает: перечислены файлы с 0k-файлом внутри. Я использую | голова в конце держит только самые большие dirs не имея 0k файл внутри. Использование теста! -f 0k, я получаю самые большие файлы. – useful 24 July 2017 в 16:33
  • 2
    @useful О, я забыл правильно сгруппировать тесты. Я отредактировал команды. – muru 24 July 2017 в 16:57
  • 3
    find: отсутствует аргумент для -execdir. Должен ли я попытаться использовать \; ) или \; -o print0)? Я сделал второе: все в порядке. Я не вижу, где вы используете -0 – useful 25 July 2017 в 09:31
  • 4
    @used последних – muru 25 July 2017 в 09:33

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

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