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

wooyq4lh  于 2023-08-07  发布在  Shell
关注(0)|答案(6)|浏览(170)

我在一个ksh脚本中使用find命令,并尝试只检索文件名,而不是完整的路径。例如,我希望它返回text.exe,而不是//severname/dir1/dir2/text.exe
我该怎么去拿呢?为了澄清,我知道文件所在的目录,我只是抓取在某个日期之前创建的文件,所以路径名无关紧要。

yiytaume

yiytaume1#

如果你用的是GNU find,那么

find path -printf "%f\n"

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

bweufnob

bweufnob2#

find ... -exec basename {} \;

字符串
也会做的把戏。但正如@肯特所问的,你为什么想要这个?

hivapdat

hivapdat3#

你可以用以下方法来实现:

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

字符串
然而,这真的有意义吗?如果有两个文件名相同,但位于不同的目录,你怎么能区分他们?
例如,在

you are in /foo

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

编辑

编辑答案以获得更好的文本格式。
正如你在评论中所描述的,所以你想
1.找到一些文件
1.将它们复制到目录,

  1. gzip他们到一个存档说a.gz
    1.仅当步骤2成功时删除复制的文件
    这可以在一个镜头中完成:
find ...|xargs tar -czf /path/to/your/target/a.gz


这将查找文件,创建一个tar(a.gz)到你的目标目录。

dvtswwa3

dvtswwa34#

还有一个答案

find | awk -F/ '{print $NF}'

字符串

j7dteeu8

j7dteeu85#

GNU find本身就支持使用-printf,所以您需要做的就是

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

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

prdp8dxp

prdp8dxp6#

其他的答案已经涵盖了它,但我会给予一个更复杂的用例,我没有找到一个简单的答案的例子。
如果您需要完整路径和-exec中的文件名,那么您需要这样做:

find ./k8s/charts/secrets/files/ \
    -type f \
    -name "*.yaml" \
    -exec sh -c \
    'vault decrypt "$1" --output "./k8s/charts/secrets/templates/$(basename "$1")"' _ {} \;

字符串
在这里,$1将获得完整路径,而$(basename "$1")将仅获得somefile.yaml。你必须在sh -c中执行,因为bash会在find运行之前扩展一次,而不是每个找到的文件。
https://www.shellcheck.net/wiki/SC2014

相关问题