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

У меня большое дерево, в нем много файлов 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.

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 – справляться с подстановочными символами. Конечно, предполагается, что у вас нет новых строк в любом из ваших имен файлов. Если вы это сделаете, решение станет намного сложнее.

  • Ошибка записи /home/alessiomtx/.config/tint2/tint2rc: не каталог
  • Можно ли узнать, какая программа или сценарий создал данный файл?
  • Проверьте, существуют ли файлы в списке файлов в определенном каталоге
  • Запишите переменную, содержащую большой текст, с \ n в файл с обычными интерпретаторами интерпретаторов. Как ты делаешь это?
  • Установите разрешения по умолчанию по типу файла (по крайней мере, в Vim)
  • Как называется каталог верхнего уровня
  • Как навсегда изменить разрешение файла / каталога
  • Разделить содержимое файла в Linux
  • Как узнать, какие программы читают мой файл?
  • Как вставить файлы с тем же именем из разных каталогов?
  • поиск файлов с определенным текстом и копирование этих файлов в другой каталог
  • Interesting Posts

    Как найти определенные файлы и переместить их в новый каталог в той же команде?

    Как написать программное обеспечение для компиляции с внешними библиотеками?

    запустить две команды в отключенном экране

    Как избежать специальных символов в строке?

    Как переключиться с bash на zsh?

    Дикросы на основе Debian, которые имеют регулярный цикл выпуска

    Двойная настройка монитора на ноутбуке: внутренний монитор просматривает внешний экран

    Используйте команду sed, чтобы проверить, существует ли конкретная строка, если нет, добавьте ее

    Приложения по умолчанию (GNOME 3)

    grub-install –no-floppy / dev / sda не работает (Funtoo)

    Загрузка с различными настройками X

    Где я должен установить морской файл-сервер: / opt или / home?

    Почему обновления, которые были перенесены в исходные версии обновлений тестирования Fedora, были невидимыми?

    Выполнить две команды по одному аргументу

    regex удалить последние четыре символа

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