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

Ste*_*eve 30 shell ksh

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

我该怎么做呢?为了澄清,我知道文件所在的目录,我只是抓住了beetoe date的创建者,所以路径名无所谓.

gle*_*man 73

如果你正在使用GNU find,那么

find path -printf "%f\n"
Run Code Online (Sandbox Code Playgroud)

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


evi*_*tto 17

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

也会做的伎俩..但正如@Kent所问,你为什么要这样?

  • @StéphaneGourichon 对于非 GNU 系统来说这是一个很好的答案。OpenBSD `find` 中没有 `-printf` (2认同)
  • 有人可能要这样做有很多原因。不要以为你什么都知道。 (2认同)

Ken*_*ent 14

你可以用:

find ..... |sed 's#.*/##'
Run Code Online (Sandbox Code Playgroud)

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

例如

you are in /foo

/foo/a.txt
/foo/bar/a.txt
Run Code Online (Sandbox Code Playgroud)

编辑

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

正如您在评论中所述,所以您想要

  1. 找一些文件,
  2. 把它们复制到一个目录,
  3. gzip他们到档案说a.gz
  4. 仅当步骤2成功时才删除复制的文件

这可以一次完成:

find ...|xargs tar -czf /path/to/your/target/a.gz 
Run Code Online (Sandbox Code Playgroud)

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


小智 7

Here's another answer.

find | awk -F/ '{print $NF}'    
Run Code Online (Sandbox Code Playgroud)


har*_*dsv 5

GNU find 本身就支持这种使用方式,-printf因此您需要做的就是

find ... -printf '%f\n'
Run Code Online (Sandbox Code Playgroud)

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