linux – 如何在文件名最大的每个目录中查找文件?

linux – 如何在文件名最大的每个目录中查找文件?,第1张

概述我有一个看起来像这样的文件结构 ./501.res/1.bin./503.res/1.bin./503.res/2.bin./504.res/1.bin 我想在每个目录中找到.bin文件的文件路径,其中文件名最高.所以我正在寻找的输出将是 ./501.res/1.bin./503.res/2.bin./504.res/1.bin 文件的最高编号是9. 题 我怎么在BASH那样做? 我找到 我有一个看起来像这样的文件结构
./501.res/1.bin./503.res/1.bin./503.res/2.bin./504.res/1.bin

我想在每个目录中找到.bin文件的文件路径,其中文件名最高.所以我正在寻找的输出将是

./501.res/1.bin./503.res/2.bin./504.res/1.bin

文件的最高编号是9.

我怎么在BASH那样做?

我找到了.| grep bin | sort

解决方法 用awk怎么样?您可以非常简单地获得FirsT事件:
[ghoti@pc ~]$cat data1./501.res/1.bin./503.res/1.bin./503.res/2.bin./504.res/1.bin[ghoti@pc ~]$awk 'BEGIN{FS="."} a[] {next} {a[]=1} 1' data1./501.res/1.bin./503.res/1.bin./504.res/1.bin[ghoti@pc ~]$

要获得最后一次出现,您可以管理几种类型:

[ghoti@pc ~]$sort -r data1 | awk 'BEGIN{FS="."} a[] {next} {a[]=1} 1' | sort./501.res/1.bin./503.res/2.bin./504.res/1.bin[ghoti@pc ~]$

鉴于您正在使用“find”和“grep”,您可能会这样做:

find . -name \*.bin -type f -print | sort -r | awk 'BEGIN{FS="."} a[] {next} {a[]=1} 1' | sort

这是如何运作的?

find命令有许多有用的选项,包括通过glob选择文件的能力,选择文件的类型等.它已经知道它的输出,并且它成为sort -r的输入.

首先,我们对输入数据进行反向排序(sort -r).这可以确保在任何目录中,编号最大的文件将首先显示.这个结果被输入awk. FS是字段分隔符,它使$2成为“/ 501”,“/ 502”等内容.Awk脚本具有条件{action}形式的部分,可以对每行输入进行评估.如果缺少某个条件,则该 *** 作将在每一行上运行.如果条件为“1”并且没有动作,则打印该行.所以这个脚本分解如下:

> a [$2] {next} – 如果存在带有下标$2的数组a(即“/ 501”),则跳转到下一行.除此以外…
> {a [$2] = 1} – 将数组的下标$2设置为1,以便将来第一个条件评估为true,然后……
> 1 – 打印线.

此awk脚本的输出将是您想要的数据,但顺序相反.最后的排序会按照您期望的顺序重新排列.

现在……这是很多管道,当你要求它同时处理数百万行输入时,排序可能会有点资源浪费.这个解决方案对于少量文件来说是完全足够的,但是如果你正在处理大量的输入,请告诉我们,我可以提出一个多功能的awk解决方案(需要超过60秒)来写).

UPDATE

根据Dennis的圣训建议,我上面包含的awk脚本可以通过改变它来改进

BEGIN{FS="."} a[] {next} {a[]=1} 1

BEGIN{FS="."}  in a {next} {a[]} 1

虽然这在功能上是相同的,但优点是您只需定义数组成员而不是为它们赋值,这可能会节省内存或cpu,具体取决于您的awk实现.无论如何,它更清洁.

总结

以上是内存溢出为你收集整理的linux – 如何在文件名最大的每个目录中查找文件?全部内容,希望文章能够帮你解决linux – 如何在文件名最大的每个目录中查找文件?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1047776.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存