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

MyU*_*ame 2 find hp-ux exec

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

find . * -exec ll {} \;

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

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

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

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

Kus*_*nda 5

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

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

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

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

find . -type f
Run Code Online (Sandbox Code Playgroud)

如果您知道要查找具有确切名称的文件file123

find . -type f -name 'file123'
Run Code Online (Sandbox Code Playgroud)

如果你想要ls -l-like 输出而不是路径名:

find . -type f -name 'file123' -ls
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 5

find . * -exec ll {} \;
Run Code Online (Sandbox Code Playgroud)

通行证.,并在当前目录(从扩展的非隐藏文件的列表*由壳),包括test子目录(如果有任何开始与这些文件的-,或者如果有一个名为!或者()...这将导致find到报告语法错误)。

所以,你告诉find查找文件的递归.,但也test。所以find会发现test两次,也test/file123两次。

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

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

它将用./test/file123and调用test/file123

在这里,你会想要:

find . -exec ls -ld {} +
Run Code Online (Sandbox Code Playgroud)

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

find甚至可能支持一个-ls行为有点列表的谓词ls -lsid

find . -ls
Run Code Online (Sandbox Code Playgroud)

  • @Fox,这是一个 GNU 扩展。许多 `find` 实现(包括可能在 OP 的 HPUX 上找到的原始实现)至少需要一个文件。POSIX `find` 规范也是如此。 (2认同)