如何从 find 命令中获取名称而不获取路径

如何从 find 命令中获取名称而不获取路径

我尝试使用 find 从搜索结果中仅获取名称,但它总是包含目录。如何使用 find 仅打印名称(或分配给变量)

find trunk/messages/ -name "*.po" -printf '%f\n'

类似的命令将其分配给变量,例如“资源”,以便稍后使用它。

编辑:如果可能的话,只显示名称而不显示扩展名。

答案1

使用find trunk/messages/ -name "*.po" -exec basename {} .po \;

示例和说明:

创建一些测试文件:

$ touch test1.po  
$ touch test2.po  
$ find . -name "*.po" -print
./test1.po  
./test2.po

好的,文件找到,包括路径。

对于每个结果执行basename,并删除名称中的 .po 部分

$ find . -name "*.po" -exec basename \{} .po \;  
test1  
test2

答案2

您可以使用-execdir不带路径的参数打印文件,例如:

find . -name "*.po" -execdir echo {} ';'

没有扩展名的文件:

find . -name "*.txt" -execdir basename {} .po ';'

注意:由于它不是 POSIX,BSDfind将打印干净的文件名,但是使用 GNUfind将打印额外的./

看:为什么 GNU find -execdir 命令的行为与 BSD find 不同?

答案3

根据我在这里找到的命令:http://www.unixcl.com/2009/08/remove-path-from-find-result-in-bash.html

您可以使用以下方法执行此操作sed(对我来说,这种方法比该basename方法执行得更快):

find trunk/messages/ -name "*.po" | sed 's!.*/!!' | sed 's!.po!!'

相关内容