GNU findのmanページには次のように記載されています。
-exec command ; [...] The string `{}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find. Both of these constructions might need to be escaped (with a `\') or quoted to protect them from expansion by the shell.
それは、男からfind
(GNU findutils)4.4.2までです。
今、私はこれをbashとdashでテストしましたが、どちら{}
もマスクされている必要はありません。以下に簡単なテストを示します。
find /etc -name "hosts" -exec md5sum {} \;
中括弧をマスクする必要があるシェルはありますか?見つかったファイルに空白(bashから呼び出された)が含まれているかどうかに依存しないことに注意してください。
find ~ -maxdepth 1 -type d -name "U*" -exec ls -d {} \;
/home/stefan/Ubuntu One
見つかったファイルがサブシェルに渡されると、これが変わります。
find ~ -maxdepth 3 -type d -name "U*" -exec bash -c 'ls -d {}' \;
ls: cannot access /home/stefan/Ubuntu: No such file or directory
ls: cannot access One: No such file or directory
次の方法で解決できます。
find ~ -maxdepth 3 -type d -name "U*" -exec bash -c 'ls -d "$0"' {} \;
とは対照的に:
find ~ -maxdepth 3 -type d -name "U*" -exec bash -c 'ls -d "{}"' \;
/home/stefan/Ubuntu One
しかし、それはマニュアルページが言っていることではありませんか?それでは、どのシェルが{}
異なる方法で処理しますか?