bash: сложный тест в команде поиска - PullRequest
1 голос
/ 20 сентября 2010

Я хотел бы сделать что-то вроде:

find . -type f -exec test $(file --brief --mime-type '{}' ) == 'text/html' \; -print 

но я не могу найти правильный способ процитировать или избежать аргументов для проверки, особенно '$ (' ... ')'.

Ответы [ 3 ]

9 голосов
/ 20 сентября 2010

Вы не можете просто экранировать аргументы для передачи их find.

. Любое расширение оболочки произойдет до запуска find.find не будет передавать свои аргументы через оболочку, поэтому, даже если вы выйдете из расширения оболочки, все будет просто рассматриваться как буквальные аргументы команды test, а не расширяться оболочкой, как вы ожидаете.

Лучший способ достичь желаемого - написать короткий сценарий оболочки, который принимает имя файла в качестве аргумента, и использовать -exec для этого:

find . -type f -exec is_html.sh {} \; -print

с is_html.sh:

#!/bin/sh

test $(file --brief --mime-type "$1") == 'text/html'

Если вы действительно хотите, чтобы все это было в одной строке, без использования отдельного сценария, вы можете вызвать sh непосредственно из find:

find . -type f -exec sh -c 'test $(file --brief --mime-type "$0") == "text/html"' {} \; -print
1 голос
/ 20 сентября 2010

Хотя может быть возможно превратить его в одно дико цитируемое утверждение, часто легче - и более ясно - быть немного более многословным:

$ find . -type f -print0 | xargs -0 file --mime-type | ↷
   grep ':[^:]*text/html$'| sed 's,:[^:]*text/html,,'
0 голосов
/ 20 сентября 2010

Вместо этого используйте "{}", для примера это просто перечисляет типы файлов:

find * -maxdepth 0 -exec file "{}" \;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...