我使用查找目录中的所有文件,所以我得到了一个路径列表。但是,我只需要文件名。例如,我得到。/dir1/dir2/file.txt,我想要得到file.txt


当前回答

老实说,basename和dirname解决方案更简单,但你也可以看看这个:

find . -type f | grep -oP "[^/]*$"

or

find . -type f | rev | cut -d '/' -f1 | rev

or

find . -type f | sed "s/.*\///"

其他回答

我已经找到了一个解决方案(在makandracards页面),这给了最新的文件名:

ls -1tr * | tail -1

(感谢Arne Hartherz)

我用它来写cp:

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

正如其他人指出的那样,您可以将find和basename结合起来,但是默认情况下basename程序一次只在一个路径上操作,因此可执行文件必须为每个路径启动一次(使用find…-exec或find…| xargs -n 1),可能会很慢。

如果您在basename上使用-a选项,那么它可以在一次调用中接受多个文件名,这意味着您可以使用xargs而不使用-n 1,将路径组合在一起,形成更少的basename调用,这应该更有效。

例子:

find /dir1 -type f -print0 | xargs -0 basename -a

这里我包含了-print0和-0(应该一起使用),以便处理文件和目录名称中的任何空白。

下面是xargs basename -a和xargs -n1 basename版本之间的时间比较。(为了进行类似的比较,这里报告的计时是在初始虚拟运行之后,因此它们都是在文件元数据已经复制到I/O缓存之后完成的。)在这两种情况下,我都将输出输出到cksum,只是为了演示输出与所使用的方法无关。

$ time sh -c 'find /usr/lib -type f -print0 | xargs -0 basename -a | cksum'
2532163462 546663

real    0m0.063s
user    0m0.058s
sys 0m0.040s

$ time sh -c 'find /usr/lib -type f -print0 | xargs -0 -n 1 basename | cksum' 
2532163462 546663

real    0m14.504s
user    0m12.474s
sys 0m3.109s

如您所见,避免每次都启动basename实际上要快得多。

在mac (BSD查找)上使用:

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

老实说,basename和dirname解决方案更简单,但你也可以看看这个:

find . -type f | grep -oP "[^/]*$"

or

find . -type f | rev | cut -d '/' -f1 | rev

or

find . -type f | sed "s/.*\///"

如果您只想对文件名运行一些操作,那么使用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