Объединение нескольких команд поиска в одну
У меня есть файл 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
файлы (сравните этот вопрос).