为什么下面的“find”命令不会“ls -l”当前目录中的每个文件?

为什么下面的“find”命令不会“ls -l”当前目录中的每个文件?
$ 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

在这两种情况下,$@在运行之前都会由当前 shell 展开find,因为它位于双引号字符串中。我猜您已$1设置为1(运行printf "%s\n" "$@"以查看位置参数的当前值)。

要按照我认为您的意图运行您的实验,您应该在命令周围使用单引号,并在命令周围使用双引号$@(以避免额外的分割);例如:

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

相关内容