Назад | Перейти на главную страницу

Как использовать оператор {} для выполнения поиска внутри exec

Я пробовал эту команду bash:

find /var/www/ -path '*wp-admin/index.php' -exec mv {} $(dirname {})/index_disabled

Но второй {} не выполняется.

Это приводит только к ./index_disabled вместо.

Как я могу дважды использовать найденный параметр в команде выполнения?

Ваша проблема не в том, что это не интерпретируется дважды, как выполнение

find . -type f -exec echo {} {} \;

покажет. Проблема в том, что {} не может использоваться в качестве аргумента функции, как вы это пытаетесь. По моему (ограниченному) опыту, если вы хотите поумнеть с find и содержание {}, вам нужно будет написать сценарий оболочки, который вызывается из find, это занимает {} как его единственный аргумент, и это делает умные вещи внутри этого скрипта.

Вот пример умного сценария:

[me@risby tmp]$ cat /tmp/clever.sh 
#!/bin/bash
echo $1 $(dirname $1)/index_disabled

Вот я использую его с find и последними несколькими строками результатов:

[me@risby tmp]$ find . -type f -exec /tmp/clever.sh {} \;
[...]
./YubiPAM-1.1-beta1/stamp-h1 ./YubiPAM-1.1-beta1/index_disabled
./YubiPAM-1.1-beta1/depcomp ./YubiPAM-1.1-beta1/index_disabled
./YubiPAM-1.1-beta1/INSTALL ./YubiPAM-1.1-beta1/index_disabled

Как видите, если я заменил echo в сценарии оболочки с mv, Я получу желаемый результат.

Вам придется использовать xargs команда и небольшая хитрость:

$ find /var/www/ -path '*wp-admin/index.php' | xargs -i sh -c 'mv {} $(dirname {})/index_disabled'

Вы можете использовать простой цикл for, чтобы решить эту проблему.

for f in $(find /var/www/ -path '*wp-admin/index.php'); do mv $f $(dirname $f)/index_disabled; done