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

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

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

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

В результате просто ./index_disabled вместо.

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

3 ответа

Решение

Вы можете использовать простой цикл для решения этой проблемы.

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

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

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'
Другие вопросы по тегам