「ls -l」の下の「find」コマンドが現在のディレクトリ内のすべてのファイルを検索しないのはなぜですか?

「ls -l」の下の「find」コマンドが現在のディレクトリ内のすべてのファイルを検索しないのはなぜですか?
$ 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ようです。$11printf "%s\n" "$@"

意図したとおりに実験を実行するには、コマンドの周囲に一重引用符を使用し、コマンドの周りに二重引用符を使用する必要があります$@(追加の分割を防ぐため)。

find . -exec sh -c 'ls -l "$@"' sh {} \;

関連情報