我想使用 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
将使用./test
和test
作为参数调用,在这种情况下, 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
目录。现在它将再次使用ll
并test
使用其中的文件。这会再次列出您的文件两次。
相反,如果您正在寻找常规文件,请使用-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
选项可以满足你的需要(按大小、修改日期等过滤文件)