Find with exec 导致重复输出?

Find with exec 导致重复输出?

是什么导致 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运行,并且在目录上运行时,它默认列出其内容。因此,每个文件在处理时都会列出lslsfind当它处理其包含目录时。

为了避免这种情况,您可以告诉ls将所有内容都作为文件处理 ( ls -ld),或者使用find's ls-like 输出(如果它有一个) ( find . -ls)。这两者也会导致目录以与文件相同的方式单独列出;您可以通过过滤文件类型来避免这种情况(例如 -type f)。

相关内容