我在一个ksh脚本中使用find命令,并尝试只检索文件名,而不是完整的路径。例如,我希望它返回text.exe,而不是//severname/dir1/dir2/text.exe。我该怎么去拿呢?为了澄清,我知道文件所在的目录,我只是抓取在某个日期之前创建的文件,所以路径名无关紧要。
//severname/dir1/dir2/text.exe
yiytaume1#
如果你用的是GNU find,那么
find path -printf "%f\n"
字符串将只打印文件名并排除路径。
bweufnob2#
find ... -exec basename {} \;
字符串也会做的把戏。但正如@肯特所问的,你为什么想要这个?
hivapdat3#
你可以用以下方法来实现:
find ..... |sed 's#.*/##'
字符串然而,这真的有意义吗?如果有两个文件名相同,但位于不同的目录,你怎么能区分他们?例如,在
you are in /foo /foo/a.txt /foo/bar/a.txt
型
编辑
编辑答案以获得更好的文本格式。正如你在评论中所描述的,所以你想1.找到一些文件1.将它们复制到目录,
find ...|xargs tar -czf /path/to/your/target/a.gz
型这将查找文件,创建一个tar(a.gz)到你的目标目录。
dvtswwa34#
还有一个答案
find | awk -F/ '{print $NF}'
字符串
j7dteeu85#
GNU find本身就支持使用-printf,所以您需要做的就是
-printf
find ... -printf '%f\n'
字符串更新:哎呀...这已经在@glenn-jackman的回答中涵盖了,我不知何故错过了。
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
$1
$(basename "$1")
somefile.yaml
sh -c
6条答案
按热度按时间yiytaume1#
如果你用的是GNU find,那么
字符串
将只打印文件名并排除路径。
bweufnob2#
字符串
也会做的把戏。但正如@肯特所问的,你为什么想要这个?
hivapdat3#
你可以用以下方法来实现:
字符串
然而,这真的有意义吗?如果有两个文件名相同,但位于不同的目录,你怎么能区分他们?
例如,在
型
编辑
编辑答案以获得更好的文本格式。
正如你在评论中所描述的,所以你想
1.找到一些文件
1.将它们复制到目录,
1.仅当步骤2成功时删除复制的文件
这可以在一个镜头中完成:
型
这将查找文件,创建一个tar(a.gz)到你的目标目录。
dvtswwa34#
还有一个答案
字符串
j7dteeu85#
GNU find本身就支持使用
-printf
,所以您需要做的就是字符串
更新:哎呀...这已经在@glenn-jackman的回答中涵盖了,我不知何故错过了。
prdp8dxp6#
其他的答案已经涵盖了它,但我会给予一个更复杂的用例,我没有找到一个简单的答案的例子。
如果您需要完整路径和-exec中的文件名,那么您需要这样做:
字符串
在这里,
$1
将获得完整路径,而$(basename "$1")
将仅获得somefile.yaml
。你必须在sh -c
中执行,因为bash会在find运行之前扩展一次,而不是每个找到的文件。https://www.shellcheck.net/wiki/SC2014