Объединение нескольких команд поиска в одну

У меня есть файл bash со следующими командами для копирования книг из папки "Мои книги" в папку "Мои чтения"

find /books -name '*.pdf'  -exec cp -n {} /toread \;
find /books -name '*.epub'  -exec cp -n {} /toread \;
find /books -name '*.azw*'  -exec cp -n {} /toread \;
find /books -name '*.mobi'  -exec cp -n {} /toread \;

Я хочу избавиться от повторяемости этих команд и объединить действия в одну?

1 ответ

Решение

-o в find Выражение логично "или". Хотя есть странность: сопоставление (которое является подразумеваемым оператором "и") имеет приоритет над -o оператор. По этой причине вам часто нужны скобки. Они должны быть экранированы или заключены в кавычки, иначе они будут интерпретироваться оболочкой:

find /books \( -name '*.pdf' -o -name '*.epub' -o -name '*.azw*' -o -name '*.mobi' ')' -exec cp -n {} /toread \;

Заметьте, что я намеренно избежал открывающей скобки и процитировал заключительную, чтобы показать два способа.

Без скобок -exec часть будет применяться только к *.mobi файлы (сравните этот вопрос).

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