当“-ls”与“find”一起使用时,它起什么作用?

当“-ls”与“find”一起使用时,它起什么作用?

根据man find

-ls

True;列出当前文件ls -dils标准输出格式。块计数为 1K 块,除非设置了环境变量 POSIXLY_CORRECT,在这种情况下使用 512 字节块。请参阅不寻常的文件名部分以获取有关如何处理文件名中不寻常字符的信息。

我不明白这个ls -dils部分。

man ls有“-d 列出目录本身,而不是其内容”。

考虑一个包含三个 .png 文件的文件夹:

$ ls
01-default.png  02-jungle.png  03-snow.png
$ 

我明白了

$ find . -type f -ls
 12983011     28 -rw-rw-r--   1 dkb    dkb       25964 Mar 10 17:28 ./01-default.png
 12982994     24 -rw-rw-r--   1 dkb    dkb       21857 Mar 10 17:28 ./03-snow.png
 12983031     28 -rw-rw-r--   1 dkb    dkb       25964 Mar 10 17:28 ./02-jungle.png
$

但是,如果-ls平均值与 相同ls -dils,我应该看到类似的结果,ls -dils但我得到的只是

$ ls -dils
13631944 4 drwxrwxr-x 2 dkb dkb 4096 Aug 30 21:22 .
$ 

然而,ls -ils更像是我用过的find东西-ls

$ ls -ils
total 80
12983011 28 -rw-rw-r-- 1 dkb dkb 25964 Mar 10 17:28 01-default.png
12983031 28 -rw-rw-r-- 1 dkb dkb 25964 Mar 10 17:28 02-jungle.png
12982994 24 -rw-rw-r-- 1 dkb dkb 21857 Mar 10 17:28 03-snow.png
$ 

所以我想知道该man find页面中是否存在拼写错误,以及是否ls -dils真的应该出现ls ils在我问题顶部引用的部分中。

答案1

对于找到的每个文件find带有-ls操作的命令显示那个文件格式类似于此命令将显示的内容,当您替换path使用该文件的路径:

ls -dils path

这就是说,find-ls运行许多命令类似,从...开始 ls -dils,找到的每个文件对应一个。不是类似于运行没有路径参数的实际命令:

ls -dils

该命令在运行时不带路径参数时会表现出特殊行为:它的行为就像传递了ls单个路径参数一样。您一直在比较该命令的行为与不带路径参数的命令的行为,但您应该将其行为与.find-lslsls 路径参数。例如,尝试以下操作:

ls -dils ./*

(因为ls对其输出进行排序,如下所述,更好的比较方法是对许多单独的命令进行排序,每个命令一个ls -dils ./filenamefilename

对于这些特定文件,带 和不带 的输出相同-d。但是,可以找到目录。您可以通过创建目录并尝试 和 来查看带 和不带 选项的命令之间find的差异。例如:ls-dls -dils ./*ls -dils ./*

ek@Cord:~/tmp$ touch a b c
ek@Cord:~/tmp$ mkdir d
ek@Cord:~/tmp$ ls -dils ./*
147774362773104141 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./a
 71213169107810485 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./b
 23080948090377031 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./c
 25051272927352243 0 drwxrwxrwx 1 ek ek 512 Aug 30 12:35 ./d
ek@Cord:~/tmp$ ls -ils ./*
147774362773104141 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./a
 71213169107810485 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./b
 23080948090377031 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./c

./d:
total 0

重申一个特别重要的观点:因为findwith-ls类似于运行许多单独的命令ls -dils path,它的行为与任何特定命令都不一样ls。(它的行为有些类似于,其中ls -dils paths...paths...是找到的所有路径find,但它也不完全类似于此,因为该ls命令对其输出进行排序,因此结果通常会以不同的顺序出现。)


另一种方法是运行一个find命令,其结果包括具有-ls操作的目录,然后运行find使用该-exec操作的相应命令来运行ls具有不同选项的实际命令。例如:

ek@Cord:~/tmp$ find . -ls
54043195528455285      0 drwxrwxrwx   1 ek       ek            512 Aug 30 12:35 .
147774362773104141      0 -rw-rw-rw-   1 ek       ek              0 Aug 30 12:35 ./a
 71213169107810485      0 -rw-rw-rw-   1 ek       ek              0 Aug 30 12:35 ./b
 23080948090377031      0 -rw-rw-rw-   1 ek       ek              0 Aug 30 12:35 ./c
 25051272927352243      0 drwxrwxrwx   1 ek       ek            512 Aug 30 12:35 ./d
ek@Cord:~/tmp$ find . -exec ls -dils {} \;
54043195528455285 0 drwxrwxrwx 1 ek ek 512 Aug 30 12:35 .
147774362773104141 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./a
71213169107810485 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./b
23080948090377031 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./c
25051272927352243 0 drwxrwxrwx 1 ek ek 512 Aug 30 12:35 ./d
ek@Cord:~/tmp$ find . -exec ls -ils {} \;
total 0
147774362773104141 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 a
 71213169107810485 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 b
 23080948090377031 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 c
 25051272927352243 0 drwxrwxrwx 1 ek ek 512 Aug 30 12:35 d
147774362773104141 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./a
71213169107810485 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./b
23080948090377031 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./c
total 0

-ls在没有 - 的情况下运行的版本中,显示的、、和的d第一个条目是abcd第一的 ls命令运行,路径为.。要验证这一点,请尝试用 代替-ok-exec它以交互方式运行,在每个命令之前提示您,因此可以清楚地了解哪些命令会产生哪些输出)。

相关内容