让 Find 只打印文件名,而不是完整路径

Posted

技术标签:

【中文标题】让 Find 只打印文件名,而不是完整路径【英文标题】:Have Find print just the filenames, not full paths 【发布时间】:2012-03-01 10:18:52 【问题描述】:

我在 ksh 脚本中使用 find 命令,我试图只检索文件名,而不是完整路径。如,我希望它返回 text.exe,而不是 //severname/dir1/dir2/text.exe

我将如何获得它?澄清一下,我知道文件所在的目录,我只是抓取在某个日期之前创建的目录,所以路径名无关紧要。

【问题讨论】:

How to only get file name with linux `find`?的可能重复 这也得到了回答here。 这个serverfault.com/questions/354403/…有很多重复项@ 【参考方案1】:

你可以这样做:

find ..... |sed 's#.*/##'

但是这真的有意义吗?如果有两个文件名相同但位于不同目录的文件,如何区分它们?

例如

you are in /foo

/foo/a.txt
/foo/bar/a.txt

编辑

编辑答案以获得更好的文本格式。

正如你在评论中描述的,所以你想

    找到一些文件, 将它们复制到一个目录, gzip 将它们压缩到一个存档文件中,比如 a.gz 仅当第 2 步成功时才删除复制的文件

这可以一次性完成:

find ...|xargs tar -czf /path/to/your/target/a.gz 

这将找到文件,制作一个 tar (a.gz) 到您的目标目录。

【讨论】:

好吧,我使用 find 是因为我试图使用 -mtime 获取某个日期之后创建的所有文件。有没有更好的办法? @Steve 你打算用'find'找到的那些文件做什么?删除目录信息有特殊要求吗? 是的,我要将它们复制到另一个目录,然后对它们进行处理,所以我想要的只是实际的文件名。否则,我必须再次运行 Find。 @Steve 什么是“做事”?如果它类似于归档到 tar,你可以找到..|xargs 到 tar 然后 mv 到你的另一个目录。无论如何,我的回答中的 |sed... 会为你截断路径信息。 @evil,您对 xargs 的看法是正确的。然后找到 -exec 或 find..-print | tar ...*.gz --files-from - 应该可以工作。感谢您指出这一点。【参考方案2】:
find ... -exec basename  \; 

也可以解决问题.. 但正如@Kent 所问,你为什么想要这个?

【讨论】:

在这个答案中使用-exec 为找到的每个文件运行一个外部程序。 @glennjackman 使用 -printf 选项的答案可能会快得多,具体取决于文件数量和操作系统。 @StéphaneGourichon 这对于非 GNU 系统来说是一个很好的答案。 OpenBSD中没有-printffind 另外(但不一定适用于非GNU),有一个basename -a 选项允许传入多个参数,还有一个find 选项允许将多个参数传递给-exec ,所以如果性能确实是一个问题,这可能会有所帮助:find ... -exec basename -a +(注意+ 而不是\; 有人可能想要这样做的原因有很多。不要以为你什么都知道。 我发现了这个问题,因为我有一个带有哈希文件名/XX/MD5HASH 的目录,我绝对确定没有重复。【参考方案3】:

如果你使用的是 GNU find,那么

find path -printf "%f\n"

将只打印文件名并排除路径。

【讨论】:

最佳答案恕我直言。 当输出没有到达终端时,你应该使用'%f\0'来处理带有线刹车的文件名。谁在文件名中使用了线刹车? 文件名的唯一非法字符是目录分隔符/和空字节\0【参考方案4】:

这是另一个答案。

find | awk -F/ 'print $NF'    

【讨论】:

NF 是字段数; $NF 是最后一个字段的值。如果你知道有 3 个字段,就像在做 $3【参考方案5】:

GNU find 使用 -printf 原生支持此功能,因此您需要做的就是

find ... -printf '%f\n'

更新:哎呀...这已经在@glenn-jackman 的答案中涵盖了,我不知何故错过了。

【讨论】:

以上是关于让 Find 只打印文件名,而不是完整路径的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中关闭当前工作目录(不是完整路径)[关闭]

使用 find 以非递归方式搜索目录中的特定文件。艾克斯

如何让 ruby​​ 打印完整的回溯而不是截断的回溯?

为啥我的 .htaccess 文件重定向到完整的服务器路径而不是相对路径?

检查appdata中是不是存在文件而不在python代码中添加完整路径

让 git diff --stat 显示完整的文件路径