如何仅从查找命令中获取名称而不包含路径


14

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

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

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

编辑:并且,如果可能的话,只有扩展名除外。

Answers:


20

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

万分感谢 :)。我可以仅从目录中删除PO扩展名吗?我的意思是:dir1 / po1.po和dir2 / po2.po是否可以像dir1 / po1和dir2 / po2一样?
2013年

@ user1754665find . -name '*.po' -exec bash -c 'echo ${0%.po}' {} \;
slhck

@slhck谢谢。最后,我需要获取不带扩展名的文件名以及它所在的最后一个文件夹:例如:dir1 / subdir1 / subsubdir1 / po1.po和dir2 / subdir2 / subsubdir2 / po2.po应该设置为类似subsubdir1 / po1的变量subsubdir2 / po2分别。
2013年

@ user1754665嗯,也许find . -name '*.po' -type f -exec sh -c 'echo $(basename $(dirname $0))/$(basename $0)' {} \;
slhck

@Hennes在最后一个花括号前加反斜杠的目的是什么find
Utku

3

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

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

没有扩展名的文件:

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

注意:由于不是POSIX,BSD find将打印干净的文件名,但是使用GNU find将打印extra ./

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.