web-dev-qa-db-ja.com

exec内の検索実行で{}演算子を使用するにはどうすればよいですか?

私はこのbashコマンドを試しました:

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

しかし、2番目の{}は実行されません。

結果は./index_disabled代わりに。

見つかったパラメータをexecuteコマンドで2回使用するにはどうすればよいですか?

4
rubo77

これを解決するには、単純なforループを使用できます。

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

あなたの問題は、それが二度解釈されないということではありません

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

ご覧のとおり、シェルスクリプトのechomvに置き換えると、目的の結果が得られます。

5
MadHatter

xargsコマンドとちょっとしたトリックを使用する必要があります。

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