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

2024-10-21 09:14:00
admin
原创
202
摘要:问题描述:我正在使用 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/
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1120  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   75  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   66  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   76  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   70  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用