Я делаю поиск файлов, которые были отредактированы в прошлый день с помощью find . -type f -mtime 0
функция в терминале. Я хочу исключить некоторые файлы и папки в запросе, такой как .DS_Store
файлы и .sh
файлы.
В настоящее время я делаю это:
find . -type f -not -path "*.DS_Store" -and -not -path "*.sh" -mtime 0
У меня все еще есть намного больше файлов, которые я хочу исключить, и я задаюсь вопросом, возможно ли сократить выражение. Я не хочу писать:
-not -path "PathHere" -and -not -path "AnotherPathHere"
и так далее.
Какие-либо предложения?
-and
избыточен невнимательный, таким образом, можно просто удалить, это, и !
может использоваться вместо нестандартного -not
оператор. Можно использовать массив удара для списка исключения того на строку. Не намного короче, но легче читать и отредактировать.
filters=(
! -name '*.DS_Store'
! -name '*.sh'
! -name '*.bash'
)
find . -type f \( "${filters[@]}" \) -print
Расширяющееся вышеупомянутое, чтобы также постараться не убывать в определенные каталоги при помощи -prune
:
filters=(
! -name '*.DS_Store'
! -name '*.sh'
! -name '*.bash'
)
prune_dirs=(
-name '*.tmp'
-o -name 'tmp'
-o -name '.Trash*'
)
find . -type d \( "${prune_dirs[@]}" \) -prune -o -type f \( "${filters[@]}" \) -print
Можно использовать стандартное сопоставление с образцом Bash, или globbing, в рамках команды находки, таким образом, Вы могли использовать -iname
опция (который является нечувствительным к регистру поиском имени), и !
как 'не' оператор, таким образом, для случая Вы позировали:
find . -type f \( ! -iname ".DS_Store" ! -iname "*.sh" \) -mtime 0