寻找 。 * -exec ll {} \; -> 只有一个结果而不是四个

寻找 。 * -exec ll {} \; -> 只有一个结果而不是四个

我想使用 find 命令来搜索一个目录中的所有文件:

find . * -exec ll {} \;

结果显示每个文件有四个(!)结果:

  • file123
  • ./test/file123
  • file123
  • test/file123

是否可以./test/file123使用 find-out-of-the-box-command 仅显示第二个结果(因此不使用诸如 之类的东西| grep '^\./')?

我正在使用最新版本的 HP/UX。

答案1

find . * -exec ll {} \;

传递.,以及当前目录中的非隐藏文件列表(由*shell 扩展),包括test子目录(如果这些文件中的任何一个以 或 开头-,或者有一个名为!或 的文件()...这将find导致报告语法错误)。

因此,您告诉我们find要在 中递归查找文件.,而且还要在test.所以find会找到test两次,也test/file123两次。

ll我认为这是一个脚本,它ls -l是一个列出文件详细信息或目录类型文件的工具,列出该目录中所有文件的详细信息(除非您传递该-d选项)。

soll将使用./testtest作为参数调用,在这种情况下, if 将在其内容中列出文件的详细信息(包括test/file)。

它将用./test/file123和来调用test/file123

在这里,您想要:

find . -exec ls -ld {} +

(使用+意味着多个文件将作为参数传递给ls哪个文件更有效,并且还可以ls对该文件列表进行排序)。

find甚至可以支持一个-ls表现为位列表的谓词ls -lsid

find . -ls

答案2

您将得到四行输出,因为您要求find搜索当前目录 ( .) 以及*扩展到的所有内容。

对于当前目录,find将继续调用ll它找到的内容,这将是当前目录、test目录和目录中的文件test。这列出了file123两次。

然后它将搜索*扩展到的所有内容,这将是test目录。现在它将再次使用lltest使用其中的文件。这会再次列出您的文件两次。

相反,如果您正在寻找常规文件,请使用-type f.您不必使用ll(或ls) 来获取结果,find因为它会默认列出找到的路径名。另外,只需将find当前目录(或test)作为搜索路径:

find . -type f

如果您知道您正在寻找具有确切名称的文件file123

find . -type f -name 'file123'

如果您想要ls -l类似的输出而不是路径名:

find . -type f -name 'file123' -ls

答案3

请注意,find将在所有目录中递归搜索。
查找不仅会返回文件,还会返回目录!

如果你想列出测试目录中的所有文件,你只需要以下命令:
find test/ -type f

另外,我不知道你想要实现什么,但是检查你的find联机帮助页...你正在使用-exec ll {} \;,我怀疑可能有一个find选项可以满足你的需要(按大小、修改日期等过滤文件)

相关内容