$ ls -l
total 0
-rw-rw-r-- 1 t t 0 Jun 8 16:37 'file; echo hello'
$ find . -exec echo {} \;
.
./file; echo hello
ls -l
以下のコマンドが現在のディレクトリ内のすべてのファイルをターゲットにしていないのはなぜですか?なぜ名前付きファイルを報告するのですか1
?ありがとうございます。
$ find . -exec sh -c "ls -l $@" sh {} \;
ls: cannot access '1': No such file or directory
ls: cannot access '1': No such file or directory
$ find . -exec sh -c "echo ls -l $@" sh {} \;
ls -l 1
ls -l 1
答え1
どちらの場合も、二重引用符で囲まれた文字列内にあるため、$@
実行する前に現在のシェルによって拡張されます。 (位置パラメータの現在値を表示するには実行)に設定したfind
ようです。$1
1
printf "%s\n" "$@"
意図したとおりに実験を実行するには、コマンドの周囲に一重引用符を使用し、コマンドの周りに二重引用符を使用する必要があります$@
(追加の分割を防ぐため)。
find . -exec sh -c 'ls -l "$@"' sh {} \;