是什么导致 ls 的输出被打印两次?
$find . -exec ls -l {} \;
total 340
-rw-rw-r-- 1 w w 163244 Aug 26 19:25 apt-list--installed.txt
-rw-rw-r-- 1 w w 162078 Aug 26 19:25 apt-list.txt
-rw-rw-r-- 1 w w 29 Aug 27 08:29 df1
-rw-rw-r-- 1 w w 31 Aug 27 08:22 df2
-rw-rw-r-- 1 w w 9 Aug 26 23:24 f1
-rw-rw-r-- 1 w w 5 Aug 26 23:21 f2
-rw-rw-r-- 1 w w 27 Aug 27 11:40 o.txt
-rw-rw-r-- 1 w w 9 Aug 26 23:24 ./f1
-rw-rw-r-- 1 w w 163244 Aug 26 19:25 ./apt-list--installed.txt
-rw-rw-r-- 1 w w 27 Aug 27 11:40 ./o.txt
-rw-rw-r-- 1 w w 5 Aug 26 23:21 ./f2
-rw-rw-r-- 1 w w 162078 Aug 26 19:25 ./apt-list.txt
-rw-rw-r-- 1 w w 29 Aug 27 08:29 ./df1
-rw-rw-r-- 1 w w 31 Aug 27 08:22 ./df2
正如您所看到的,这些文件在上面的输出中列出了两次。为什么?
答案1
发生这种情况是因为在它找到的所有文件和目录上find
运行,并且在目录上运行时,它默认列出其内容。因此,每个文件在处理时都会列出ls
ls
find
和当它处理其包含目录时。
为了避免这种情况,您可以告诉ls
将所有内容都作为文件处理 ( ls -ld
),或者使用find
's ls
-like 输出(如果它有一个) ( find . -ls
)。这两者也会导致目录以与文件相同的方式单独列出;您可以通过过滤文件类型来避免这种情况(例如 -type f
)。