mar*_*rix 243 linux shell find
我正在使用find到目录中的所有文件,所以我得到了一个路径列表.但是,我只需要文件名.即我得到了./dir1/dir2/file.txt
,我想得到file.txt
Sie*_*geX 325
在GNU中,find
您可以使用-printf
参数,例如:
find /dir1 -type f -printf "%f\n"
Run Code Online (Sandbox Code Playgroud)
Kam*_*bus 145
如果您的find没有-printf选项,您也可以使用basename:
find ./dir1 -type f -exec basename {} \;
Run Code Online (Sandbox Code Playgroud)
kur*_*umi 23
如果你正在使用GNU find
find . -type f -printf "%f\n"
Run Code Online (Sandbox Code Playgroud)
或者您可以使用Ruby等编程语言(1.9+)
$ ruby -e 'Dir["**/*"].each{|x| puts File.basename(x)}'
Run Code Online (Sandbox Code Playgroud)
如果你喜欢bash(至少4)解决方案
shopt -s globstar
for file in **; do echo ${file##*/}; done
Run Code Online (Sandbox Code Playgroud)
ken*_*orb 23
用于-execdir
自动保存当前文件的用户{}
,例如:
find . -type f -execdir echo '{}' ';'
Run Code Online (Sandbox Code Playgroud)
您也可以使用$PWD
而不是.
(在某些系统上,它不会在前面产生额外的点).
如果你还有一个额外的点,或者你可以运行:
find . -type f -execdir basename '{}' ';'
Run Code Online (Sandbox Code Playgroud)
-execdir utility [argument ...] ;
的
-execdir
初级是相同的-exec
,不同的是实用程序将来自该目录被执行主保持当前文件.
当+
代替使用时;
,{}
每次调用实用程序时都会用尽可能多的路径名替换.换句话说,它会在一行中打印所有文件名.
j03*_*03m 11
如果你只想对文件名运行一些操作,使用basename
可能很难.
例如:
find ~/clang+llvm-3.3/bin/ -type f -exec echo basename {} \;
Run Code Online (Sandbox Code Playgroud)
只会回显basename /my/found/path
.如果我们想要在文件名上执行,那不是我们想要的.
但是你可以xargs
输出.例如,根据另一个目录中的名称杀死目录中的文件:
cd dirIwantToRMin;
find ~/clang+llvm-3.3/bin/ -type f -exec basename {} \; | xargs rm
Run Code Online (Sandbox Code Playgroud)
正如其他人指出的那样,您可以组合find
和basename
,但默认情况下basename
,程序一次只能在一个路径上运行,因此必须为每个路径启动一次可执行文件(使用 或find ... -exec
)find ... | xargs -n 1
,这可能会很慢。
如果您使用-a
上的选项basename
,那么它可以在一次调用中接受多个文件名,这意味着您可以在xargs
不使用-n 1
, 的情况下使用,将路径组合在一起,形成数量少得多的 调用basename
,这应该会更有效。
例子:
find /dir1 -type f -print0 | xargs -0 basename -a
Run Code Online (Sandbox Code Playgroud)
这里我包含了-print0
and -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
Run Code Online (Sandbox Code Playgroud)
basename
正如您所看到的,避免每次启动确实要快得多。
在Mac(BSD find
)上,使用:
find /dir1 -type f -exec basename {} \;
Run Code Online (Sandbox Code Playgroud)