如何只获得文件名与Linux`发现`?

我使用查找目录中的所有文件,所以我得到一个path列表。 不过,我只需要文件名。 即我得到./dir1/dir2/file.txt ,我想获得file.txt

在GNU find你可以使用-printf参数,例如:

 find /dir1 -type f -printf "%f\n" 

如果你的find没有-printf选项,你也可以使用basename:

 find ./dir1 -type f -exec basename {} \; 

如果您使用GNU查找

 find . -type f -printf "%f\n" 

或者你可以使用一种编程语言,比如Ruby(1.9+)

 $ ruby -e 'Dir["**/*"].each{|x| puts File.basename(x)}' 

如果你喜欢bash(至less4)的解决scheme

 shopt -s globstar for file in **; do echo ${file##*/}; done 

使用-execdir自动保存{}的当前文件,例如:

 find . -type f -execdir echo '{}' ';' 

你也可以用$PWD代替. (在某些系统中,它不会在前面产生额外的点)。

-execdir utility [argument ...] ;

-execdir主要与-exec主要相同,只是将从保存当前文件的目录执行实用程序。

当使用+而不是; ,那么对于每个实用程序调用, {}将被尽可能多的path名replace。 换句话说,它将在一行中打印所有的文件名。

如果您只想对文件名运行一些操作,那么使用basename可能会很困难。

比如这个:

 find ~/clang+llvm-3.3/bin/ -type f -exec echo basename {} \; 

将只是回声basename /my/found/path 。 不是我们想要的,如果我们想要执行的文件名。

但是,你可以xargs输出。 例如根据另一个目录中的名称来杀死目录中的文件:

 cd dirIwantToRMin; find ~/clang+llvm-3.3/bin/ -type f -exec basename {} \; | xargs rm 

我find了一个解决scheme(在makandracards页面上),只给出了最新的文件名:

 ls -1tr * | tail -1 

(感谢Arne Hartherz)

我用它为cp

 cp $(ls -1tr * | tail -1) /tmp/