我使用查找目录中的所有文件,所以我得到了一个路径列表。但是,我只需要文件名。例如,我得到。/dir1/dir2/file.txt,我想要得到file.txt
当前回答
正如其他人指出的那样,您可以将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 {} \;
如果你的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(至少4个)解决方案
shopt -s globstar
for file in **; do echo ${file##*/}; done
老实说,basename和dirname解决方案更简单,但你也可以看看这个:
find . -type f | grep -oP "[^/]*$"
or
find . -type f | rev | cut -d '/' -f1 | rev
or
find . -type f | sed "s/.*\///"
正如其他人指出的那样,您可以将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实际上要快得多。
推荐文章
- 在Bash中检查变量是否存在于列表中
- 查看PS命令的全部输出
- 确保一次只运行一个shell脚本实例的快速方法
- Linux命令将域名转换为IP
- 如何从命令行在windows中找到mysql数据目录
- 如何在Makefile中设置子进程的环境变量
- 如何让“wc -l”打印没有文件名的行数?
- 有效地测试Linux上的端口是否打开?
- 如何从另一个文件A中删除文件B中出现的行?
- 对以制表符分隔的文件进行排序
- Shell脚本删除超过n天的目录
- 使用sudo时未找到命令
- 当有命令行参数时,如何使用GDB分析程序的核心转储文件?
- 如何检查shell脚本中是否存在命令?
- 如何使用查找命令从列表中查找所有具有扩展名的文件?