我使用查找目录中的所有文件,所以我得到了一个路径列表。但是,我只需要文件名。例如,我得到。/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/.*\///"

其他回答

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

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

-exec和-execdir很慢,xargs才是王道。

$ alias f='time find /Applications -name "*.app" -type d -maxdepth 5'; \
f -exec basename {} \; | wc -l; \
f -execdir echo {} \; | wc -l; \
f -print0 | xargs -0 -n1 basename | wc -l; \
f -print0 | xargs -0 -n1 -P 8 basename | wc -l; \
f -print0 | xargs -0 basename | wc -l

     139
    0m01.17s real     0m00.20s user     0m00.93s system
     139
    0m01.16s real     0m00.20s user     0m00.92s system
     139
    0m01.05s real     0m00.17s user     0m00.85s system
     139
    0m00.93s real     0m00.17s user     0m00.85s system
     139
    0m00.88s real     0m00.12s user     0m00.75s system

Xargs的并行性也有帮助。

有趣的是,我无法解释xargs没有-n1的最后一种情况。 它会给出正确的结果,并且是最快的¯\_()_/¯

(basename只带1个路径参数,但是xargs会发送所有的路径参数(实际上是5000个)而不带-n1。不适用于linux和openbsd,只适用于macOS…)

一些来自linux系统的更大的数字,以了解-execdir的帮助,但仍然比并行的xargs慢得多:

$ alias f='time find /usr/ -maxdepth 5 -type d'
$ f -exec basename {} \; | wc -l; \
f -execdir echo {} \; | wc -l; \
f -print0 | xargs -0 -n1 basename | wc -l; \
f -print0 | xargs -0 -n1 -P 8 basename | wc -l

2358
    3.63s real     0.10s user     0.41s system
2358
    1.53s real     0.05s user     0.31s system
2358
    1.30s real     0.03s user     0.21s system
2358
    0.41s real     0.03s user     0.25s system

在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/.*\///"

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

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