У меня есть файл 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 ответ1

4

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .