如何只用linux`get`获取文件名?

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)

  • 这仅适用于GNU (23认同)
  • 显然*答案*,但缺乏细节. (8认同)
  • find:-printf:unknown primary或​​operator (6认同)
  • 我认为这不是正确的答案。`find -printf "%f\n" -exec echo {} \;` 显示原始文件名被向前传递 (3认同)
  • 当我使用多种文件类型(-o开关)时,这对我不起作用 (2认同)

Kam*_*bus 145

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

find ./dir1 -type f -exec basename {} \;
Run Code Online (Sandbox Code Playgroud)

  • 引用分号是另一种消除歧义的方法:`... {}';'` (17认同)

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)


ala*_*ani 7

正如其他人指出的那样,您可以组合findbasename,但默认情况下basename,程序一次只能在一个路径上运行,因此必须为每个路径启动一次可执行文件(使用 或find ... -execfind ... | xargs -n 1,这可能会很慢。

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

例子:

find /dir1 -type f -print0 | xargs -0 basename -a
Run Code Online (Sandbox Code Playgroud)

这里我包含了-print0and -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正如您所看到的,避免每次启动确实要快得多。


spe*_*rum 6

在Mac(BSD find)上,使用:

find /dir1 -type f -exec basename {} \;
Run Code Online (Sandbox Code Playgroud)