Я нашел следующий удивительный небольшой скрипт по ссылке
$ find / home / bruno / old-friends -type f -exec sed -i 's / ugly / beautiful / g '{} \;
blockquote>Но я действительно не понимаю последний бит
{} \;
blockquote>Может кто-нибудь объяснить, пожалуйста?
Спасибо!
Я уже некоторое время использую страницу about.com Linux, которая охватывает
find - поиск файлов в иерархии каталогов
blockquote>в качестве ссылки для некоторое время, и оно охватывает ту часть команды, о которой вы спрашиваете.
find . -type f -exec file '{}' \;
Запускает файл для каждого файла в текущем каталоге или ниже. Обратите внимание, что фигурные скобки заключены в одинарные кавычки, чтобы защитить их от интерпретации как пунктуации сценария оболочки. Точка с запятой аналогичным образом защищена с помощью обратной косой черты, хотя ';' можно было бы использовать и в этом случае.
Так что я думаю, что ваша команда должна иметь точки с запятой вокруг скобок, чтобы быть в безопасности.
Ссылки:
С exec
(а не с xargs) необходимо включить {}
, так как оно заменяется именем файла, на который нацелена команда find; это заполнитель, который обычно указывается в кавычках, так что если в любых целевых файлах есть пробелы, команда все равно будет успешно выполняться для всех файлов. semicolon
должен быть включен, так как он заканчивает команду, так же, как и при разделении нескольких команд в командной строке. В этом случае должно быть escaped
, чтобы команда find получила его из оболочки без расширения (в виде литерала). Есть много обучающих программ по этому вопросу онлайн, см., Например, эту полезную статью.
Еще одна замечательная и действительно важная статья состоит в том, что на сайте Wooledge очень хорошо объясняется команда find, exec и важность цитирования различных элементов в вашей команде или скрипте. Я обнаружил, что эта статья и сайт в целом очень полезны для изучения сценариев bash и bash.
Это не совсем проблема синтаксиса sed
, это проблема синтаксиса find
.
{}
- это контейнер, который заменит имя файла, обрабатываемого командой sed
.
Если вы используете find
следующим образом:
$ find . -type f -name *.py -exec head {} \;
Это найдет скрипты Python и покажет вам заголовок каждого файла. Если у вас есть три сценария в текущем каталоге:
{}
будет содержать каждое имя файла и выполнять команду head
для каждого файла.
Аргументу -exec
нужен конец ;
, чтобы он мог распознать конец аргументов команды (в данном случае sed
), но, чтобы защитить ;
от раскрытия, вам нужно его избежать с \
.
Помните, что вы можете выполнять несколько команд одновременно, если используете ;
:
$ ls; pwd;
. В этом списке будут перечислены каталоги (ls
) и напечатан ваш рабочий каталог (pwd
). Аргумент -exec
также нуждается в ;
. Но так как вы не хотите путать ;
, который разделяет команды, с ;
, который является частью аргумента -exec
в find
, вам нужно экранировать его с \
.
В качестве альтернативы, вы можете использовать кавычки вокруг ;
:
$ find /home/bruno/old-friends -type f -exec sed -i 's/ugly/beautiful/g' {} ";"
Я надеюсь, что прояснил себя