Я пробовал эту команду 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