我有以下说明:
- 查找目录中所有
/x/y/z
扩展名为.jpg
. - 写出匹配列表文件名,每行一个,到文件
/x/y/file1.txt
. - 确保指定每个文件的绝对路径。
您能帮助理解该说明吗?我最初想到使用以下命令:
find /x/y/z -name '*.jpg' -exec basename '{}' >> /x/y/file1.txt \;
但是,鉴于最后一条指令(...绝对路径),我认为:
find /x/y/z -name '*.jpg' -exec pathname '{}' >> /x/y/file1.txt \;
哪个是对问题/指令的正确响应(命令)?
答案1
在这个答案中,我假设您的说明的第二点实际上意味着“路径名”而不是“文件名”。否则第三点就没有意义了。
默认情况下,该find
实用程序将输出所找到文件的相对于顶级搜索路径的完整路径。
在命令中
find /x/y/z -name '*.jpg' -print
...find
将打印出路径名,例如/x/y/z/foo/bar/baz.jpg
.如果顶级搜索路径是某个目录的绝对路径名,则输出将自动是找到的文件的绝对路径名。
另一方面,如果您使用
find x/y/z -name '*.jpg' -print
/
(注意开头缺少x/y/z
),那么你显然会得到相对路径名的输出。
您可以使用 Linux 上的实用程序将它们转换为绝对路径名realpath
:
find x/y/z -name '*.jpg' -exec realpath {} +
这会realpath
调用批量找到的路径名。
在非 Linux 系统上,realpath
如果安装了 GNU coreutils,则可能会安装相同的实用程序(但随后可能会调用它grealpath
)。
另请参见man realpath
(或man grealpath
)。
重新阅读您的说明,其中没有任何内容暗示您应该使用find
.find
如果您只关心单个目录中的名称,则不需要使用。
这个练习也可以通过以下方式解决
printf '%s\n' /x/y/z/*.jpg >/x/y/file1.txt
这列出了.jpg
目录中以 结尾的所有名称/x/y/z
。如果您手头没有该目录的绝对路径,请使用
realpath x/y/z/*.jpg >/x/y/file1.txt