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

2024-10-21 09:14:00
admin
原创
90
摘要:问题描述:我正在使用 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/
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用