如何仅使用 Linux‘find’获取文件名?

2024-10-21 09:14:00
admin
原创
241
摘要:问题描述:我正在使用 find 查找目录中的所有文件,因此我得到了一个路径列表。但是,我只需要文件名。即我得到了./dir1/dir2/file.txt并且我想要得到file.txt解决方案 1:在 GNU 中find你可以使用-printf参数来实现这一点,例如:find /dir1 -type f -pr...

问题描述:

我正在使用 find 查找目录中的所有文件,因此我得到了一个路径列表。但是,我只需要文件名。即我得到了./dir1/dir2/file.txt并且我想要得到file.txt


解决方案 1:

在 GNU 中find你可以使用-printf参数来实现这一点,例如:

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

解决方案 2:

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

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

解决方案 3:

使用-execdir它会自动保存当前文件{},例如:

find . -type f -execdir echo '{}' ';'

您也可以使用它$PWD来代替.(在某些系统上它不会在前面产生额外的点)。

如果您还有一个多余的点,您也可以运行:

find . -type f -execdir basename '{}' ';'

-execdir utility [argument ...] ;

主要程序-execdir与主要程序相同,不同之处在于实用程序将从保存当前文件-exec的目录执行。

当使用+代替 时;{}每次调用实用程序时都会用尽可能多的路径名替换。换句话说,它会在一行中打印所有文件名。

解决方案 4:

如果你使用 GNU find

find . -type f -printf "%f
"

或者你可以使用 Ruby(1.9+)等编程语言

$ ruby -e 'Dir["**/*"].each{|x| puts File.basename(x)}'

如果你喜欢 bash (至少 4) 解决方案

shopt -s globstar
for file in **; do echo ${file##*/}; done

解决方案 5:

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

解决方案 6:

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

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

例子:

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

这里我包含了-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

正如您所见,避免basename每次启动确实要快得多。

解决方案 7:

在 Mac(BSD find)上使用:

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

解决方案 8:

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

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

或者

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

或者

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

解决方案 9:

-exec且慢-execdirxargs为王。

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

解决方案 10:

我找到了一个解决方案(在 makandracards 页面上),它只提供最新的文件名:

ls -1tr * | tail -1

(感谢 Arne Hartherz)

我使用它来cp

cp $(ls -1tr * | tail -1) /tmp/
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用