Я использую find
для поиска и удаления файлов резервных копий, но хочу исключить определенные каталоги из поиска. Резервные имена файлов может заканчиваться .bck
, bak
, ~
или backup
.
Код минимального рабочего примера (MWE), который нужно исключить только из трех каталогов:
#! /bin/bash
find . -type d \( -path "./.*" -o -path "./Music" -o -path "./Documents" \) -prune -o -type f \( -name "*.bck" -o -name "*.bak" -o -name "*~" -o -name "*.backup" \) -print0 | xargs -0 --no-run-if-empty trash-put
Синтаксис \( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune
кажется немного неуклюжим, особенно если нужно исключить около десяти каталогов, хотя я показал только три в MWE.
Есть ли более элегантный способ использования либо входного файла со списком исключенных каталогов, либо массива или конструкции, подобной списку, которая может быть введена в действие?
Я прошу прощения за то, что не был более явным, когда я написал свой оригинальный вопрос.
NB: trash-put
это утилита, которая перемещает файлы Trashcan
вместо того, чтобы удалять их [1].
С помощью GNU find (то есть под не встроенным Linux или Cygwin) вы можете использовать
-regex
для объединения всех этих-path
подстановочных знаков в одно регулярное выражение.С FreeBSD или OSX используйте
-E
вместо-regextype posix-extended
.источник
Сгруппируйте
-path ... -prune
в одно выражение,\( ... \)
используя-o
( или ) логику.Пример не будет итерация каталоги или файлы на или под
/somepath/a
,/somepath/b
и/somepath/c
.Вот более конкретный пример использования нескольких действий.
источник
Похоже, это скорее вопрос оболочки, чем
find
вопрос. С файлом, содержащим( -name dir1 -o -name dir2 ) -prune
(без "\"!), Вы можете просто сделать это:Однако, не изменяя сам вызов find (
eval find
или изменяя $ IFS), это работает с путями без пробелов.Если вы хотите сохранить файл проще, вы можете написать скрипт.
И использовать
вместо.
источник
-name
bypath
).\( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune
исключить определенные каталоги из рекурсивного поиска, которыйfind
делает. Я не ищу ничего внутри файлов, а скорее удаляю определенные файлы и избегаю определенных каталогов в моем пути поиска. Я тоже не понимаю, что пытается сделать твой сценарий. Итак, похоже, у нас есть недопонимание. Сожалею. Давайте оставим это на этом.