Как включать/исключать много различных файлов/папок с помощью терминала

Я делаю поиск файлов, которые были отредактированы в прошлый день с помощью 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" и так далее.

Какие-либо предложения?

3
задан 25 November 2015 в 15:01

2 ответа

-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
6
ответ дан 1 December 2019 в 13:24

Можно использовать стандартное сопоставление с образцом Bash, или globbing, в рамках команды находки, таким образом, Вы могли использовать -iname опция (который является нечувствительным к регистру поиском имени), и ! как 'не' оператор, таким образом, для случая Вы позировали:

find . -type f \( ! -iname ".DS_Store" ! -iname "*.sh" \) -mtime 0
1
ответ дан 1 December 2019 в 13:24

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

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