как удалить все файлы с определенным расширением в определенных именованных папках в большом дереве?

У меня большое дерево, в нем много файлов pdf . Я хочу удалить файлы pdf в этом дереве, но только те файлы pdf в подпапках с именами rules/ Существуют другие типы файлов внутри rules/ . В rules/ подпапках нет других подпапок.

Например, у меня есть это дерево. Все ниже «источника»

  source/ A/ rules/*.pdf, *.txt, *.c,etc.. etc/ B/ keep_this.pdf rules/*.pdf whatever/ C/ D/ rules/*.pdf something/ 

и так далее. Есть pdf файлы повсюду, но я хочу только удалить все файлы pdf которые находятся в папках, называемых rules/ и ни в каком другом месте.

Я думаю, мне нужно использовать

  cd source find / -type d -name "rules" -print0 | xargs -0 <<<rm *.pdf?? now what?>>> 

Но я не уверен, что делать после получения списка всех подпапок с именами rules/

Любая помощь приветствуется.

На Linux mint.

  • Как получить доступ для чтения к каталогу другого пользователя?
  • Разрешение группы ACL по-прежнему не позволяет разрешениям на запись
  • Bash - получить строку, содержащую пробелы в цикле
  • Как найти полную историю файла?
  • Создать каталог из файлов и переместить файлы
  • Как рекурсивно искать каталог по имени и удалять в нем все обычные файлы
  • Почему я получаю разрешение на отказ при правильном использовании прав на mv althrough?
  • Как создать зашифрованный контейнер (динамически расширяемый) на OpenBSD
  • 4 Solutions collect form web for “как удалить все файлы с определенным расширением в определенных именованных папках в большом дереве?”

    Я бы выполнил find внутри другой find . Например, я бы выполнил эту командную строку, чтобы отобразить файлы, которые будут удалены:

     $ find /path/to/source -type d -name 'rules' -exec find '{}' -mindepth 1 -maxdepth 1 -type f -iname '*.pdf' -print ';' 

    Затем, проверив список, я выполнил бы:

     $ find /path/to/source -type d -name 'rules' -exec find '{}' -mindepth 1 -maxdepth 1 -type f -iname '*.pdf' -print -delete ';' 

    С оболочкой, которая поддерживает расширенные globs и null globs, например zsh :

     for d in ./**/rules/ do set -- ${d}*.pdf(N) (( $# > 0 )) && printf %s\\n $@ done 

    или bash :

     shopt -s globstar shopt -s nullglob for d in ./**/rules/ do set -- "${d}"*.pdf (( $# > 0 )) && printf %s\\n "$@" done 

    замените printf %s\\n на rm если вы довольны результатом.


    Поскольку вы находитесь на gnu / linux, вы также можете запустить:

     find . -type f -regextype posix-basic -regex '.*/rules/[^/]*.pdf' -delete 

    удалите -delete если вы хотите выполнить сухой пробег.

    Самый простой

     find source -name '*.pdf' -path '*/rules/*.pdf' -exec rm '{}' + 

    Почему первое имя? Потому что это будет немного быстрее. Также + вместо ; выполняет один rm со многими аргументами вместо многих с одним аргументом. Так меньше нереста процесса. В bash вы можете уйти без цитирования {} .

    Вы можете использовать скрипт bash для этого (не лучшим образом):

     #!/bin/bash # Don't screw us up with spaces! IFS=$'\n'; set -f DIRS=$(find . -type d -name "rules") for i in $DIRS; do set +f rm $i/*.pdf done set +f 

    Это повторяется через каталоги, которые вы найдете в вашей команде find и удаляет PDF-файлы под каждым каталогом.

    Строка IFS=$'\n' заключается в том, чтобы справляться с пробелами в именах файлов, а set -f – справляться с подстановочными символами. Конечно, предполагается, что у вас нет новых строк в любом из ваших имен файлов. Если вы это сделаете, решение станет намного сложнее.

    Linux и Unix - лучшая ОС в мире.