从包含数百万个文件的目录中精确匹配地高效查找数千个文件 (bash/python/perl)

2023-12-19

我在 Linux 上,试图从包含数百万个文件的目录 (SOURCE_DIR) 中查找数千个文件。我有一个需要查找的文件名列表,存储在单个文本文件(FILE_LIST)中。该文件的每一行都包含与 SOURCE_DIR 中的文件相对应的单个名称,并且该文件中有数千行。

## FILE_LIST contain single word file names, each per line
#Name0001
#Name0002
#..
#Name9999

我想将文件复制到另一个目录 (DESTINATION_DIR)。我写了下面的循环,里面有一个循环来一一查找。

#!/bin/bash
FILE_LIST='file.list'
## FILE_LIST contain single word file names, each per line
#Name0001
#Name0002
#..
#Name9999

SOURCE_DIR='/path/to/source/files' # Contain millions of files in sub-directories
DESTINATION_DIR='/path/to/destination/files' # Files will be copied to here


while read FILE_NAME
do
    echo $FILE_NAME
    for FILE_NAME_WITH_PATH in `find SOURCE_DIR -maxdepth 3 -name "$FILE_NAME*" -type f -exec readlink -f {} \;`; 
    do 
        echo $FILE
        cp -pv $FILE_NAME_WITH_PATH $DESTINATION_DIR; 
    done
done < $FILE_LIST

这个循环花费了很多时间,我想知道是否有更好的方法来实现我的目标。我进行了搜索,但没有找到解决我的问题的方法。如果已经存在,请直接向我提供解决方案,或者建议对上述代码进行任何调整。如果有另一种方法,甚至是 python/perl 解决方案,我也很好。感谢您的时间和帮助!


需要找到要复制的文件,因为它们没有给出路径(不知道它们在哪个目录中),但重新搜索每个文件非常浪费,大大增加了复杂性。

相反,首先为每个文件名构建一个具有完整路径名的哈希。

一种方法是使用 Perl,利用快速核心模块文件::查找 https://perldoc.perl.org/File/Find.html

use warnings;
use strict;
use feature 'say';

use File::Find;
use File::Copy qw(copy);

my $source_dir = shift // '/path/to/source';  # give at invocation or default

my $copy_to_dir = '/path/to/destination';

my $file_list = 'file_list_to_copy.txt';  
open my $fh, '<', $file_list or die "Can't open $file_list: $!";
my @files = <$fh>;
chomp @files;


my %fqn;    
find( sub { $fqn{$_} = $File::Find::name  unless -d }, $source_dir );

# Now copy the ones from the list to the given location        
foreach my $fname (@files) { 
    copy $fqn{$fname}, $copy_to_dir  
        or do { 
            warn "Can't copy $fqn{$fname} to $copy_to_dir: $!";
            next;
        };
}

The remaining problem is about filenames that may exists in multiple directories, but we need to be given a rule for what to do then.

我忽略了问题中使用的最大深度,因为它是无法解释的,并且在我看来是与极端运行时间相关的修复(?)。此外,根据问题的提示,文件被复制到“平面”结构中(不恢复其原始层次结构)。

最后,我只跳过目录,而其他各种文件类型都有自己的问题(复制周围的链接需要小心)。仅接受纯文件更改unless -d to if -f.


A clarification came that, indeed, there may be files with the same name in different directories. Those should be copied to same name suffixed with a sequential number before the extension.

For this we need to check whether a name exists already, and to keep track of duplicate ones, while building the hash, so this will take a little longer. There is a little conundrum of how to account for duplicate names then? I use another hash where only duped-names are kept, in arrayrefs; this simplifies and speeds up both parts of the job.

my (%fqn, %dupe_names);
find( sub {
    return if -d;
    (exists $fqn{$_})
        ? push( @{ $dupe_names{$_} }, $File::Find::name )
        : ( $fqn{$_} = $File::Find::name );
}, $source_dir );

令我惊讶的是,在散布在庞大的层次结构中的 25 万个文件上,即使现在对每个项目运行测试,它的运行速度也只比代码慢一点,而不用担心重复的名称。

中赋值周围的括号三元运算符 https://perldoc.perl.org/perlop.html#Conditional-Operator需要,因为操作符可能会被赋值(如果最后两个参数是有效的“左值”,就像它们在这里一样),所以需要小心分支内的赋值。

然后复制后%fqn与帖子的主要部分一样,也复制其他同名文件。我们需要分解文件名以便在之前添加枚举.ext;我用核心文件::基本名称 https://perldoc.perl.org/File/Basename.html

use File::Basename qw(fileparse);

foreach my $fname (@files) { 
    next if not exists $dupe_names{$fname};  # no dupe (and copied already)
    my $cnt = 1;
    foreach my $fqn (@{$dupe_names{$fname}}) { 
        my ($name, $path, $ext) = fileparse($fqn, qr/\.[^.]*/); 
        copy $fqn, "$copy_to_dir/${name}_$cnt$ext";
            or do { 
                warn "Can't copy $fqn to $copy_to_dir: $!";
                next;
            };
        ++$cnt;
    }
}

(已完成基本测试,但仅此而已)

我也许会用undef代替$path上面,表明该路径未使用(同时这也避免了分配和填充标量),但为了让那些不熟悉模块的子返回内容的人清楚起见,我将其保留为这种方式。

Note.对于有重复的文件,会有副本fname.ext, fname_1.ext等等。如果您愿意的话all索引,然后首先重命名fname.ext(在目的地,它已经通过复制%fqn) to fname_1.ext,并将计数器初始化更改为my $cnt = 2;.


These by no means need be same files.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从包含数百万个文件的目录中精确匹配地高效查找数千个文件 (bash/python/perl) 的相关文章

  • 通过getattr动态获取dict元素?

    我想动态查询我想要检索的类中的哪些对象 getattr似乎是我想要的 并且它对于类中的顶级对象表现良好 但是 我还想指定子元素 class MyObj object def init self self d a 1 b 2 self c 3
  • 如何从字符串读取 NumPy 二维数组?

    如何从字符串中读取 Numpy 数组 取一个像这样的字符串 0 5544 0 4456 0 8811 0 1189 并将其转换为数组 a from string 0 5544 0 4456 0 8811 0 1189 where a成为对象
  • 在 Django 中处理 subprocess.call()

    我正在开发的应用程序的简单想法是用户给出 Linux 命令 Linux 命令的结果将显示在网络浏览器中 这是我的观点 py from django shortcuts import render to response from djang
  • pip 中的新彩色终端进度条

    我发现新版本的pip Python的包安装程序 有一个彩色进度条来显示下载进度 我怎样才能做到这一点 Like this pip 本身正在使用rich https pypi org project rich 包裹 特别是 他们的进度条文档
  • 如何让服务器监听多个端口

    我想用同一台服务器监听 100 个不同的 TCP 端口 这是我目前正在做的事情 import socket import select def main server socket socket socket socket AF INET
  • 使用 numba 计算向量和矩阵中的行之间的余弦相似度

    找到了这个gist https gist github com FedericoV 0e7d6d8c8794a99a7a42使用 numba 快速计算余弦相似度 import numba numba jit target cpu nopyt
  • 在 ReportLab 中向画布元素添加超链接的最简单方法是什么?

    我正在使用 ReportLab 使用 Python 制作 pdf 我想向画布添加一个形状 并让该形状充当超链接 使以下示例中的矩形链接到 google com 的最简单方法是什么 from reportlab pdfgen import c
  • 在 Python 中打开文本文件时出现问题

    这看起来应该很简单 f open C Users john Desktop text txt r 但我收到此错误 Traceback most recent call last File
  • 用户在对话框中输入

    python 中是否有任何库可用于图形用户输入 我知道关于tk但我相信需要一些代码才能做到这一点 我正在寻找最短的解决方案 a input Enter your string here 取而代之的是 我想要一个对话框 以便用户可以在那里输入
  • Python中基于行输入的条件求和

    我正在尝试用Python 做一个条件和积 简化的思路如下 A 1 1 2 3 3 3 B 0 50 0 25 0 99 0 80 0 70 0 20 我想要作为输出 Total1 0 50 1 0 25 1 Total2 0 99 2 To
  • Google CoLab 中的 Python 3 支持

    我一直在尝试使用 Jupyter 笔记本https colab research google com https colab research google com 并且默认情况下它们似乎运行 Python 2 7 有什么方法可以在 Co
  • 将字符串作为有序字典导入

    我有一个没有扩展名的文件 其中包含这样的行 忽略行之间的间距 但每一行都是单独的行 OrderedDict key1 u value1 key2 value2 OrderedDict key1 u value1 key2 value2 Or
  • 如何更新 certifi 的根证书?

    我正在使用 certifi python 模块来验证 ssl 连接 我查看了 certifi python2 7 site packages certifi cacert pem 中包含的根证书 其中一些证书已过期 我如何更新这些证书 我尝
  • 当按下 flutter 中编写的按钮时,有没有办法运行 python 脚本?

    本质上 我想做的是 按下我在 Flutter 中编程的按钮 当按下该按钮时 Python 脚本应该开始在我的 Android 设备上运行 我想在 python 中使用 youtube dl 用于下载 Youtube 视频 库 但我想知道是否
  • 如何使用 json 谷歌翻译 api?

    我正在尝试使用来自 python 的 google 翻译和 utf 8 文本 如何调用json api 他们有一个将其嵌入 html 的文档 但我在任何地方都找不到合适的 API 或 wsdl 谢谢 拉斐尔 这是最终对我有用的代码 使用没有
  • Git 责备文件中的作者列表

    有没有办法找到在 repo 中编辑 java 文件中的类的作者列表git blame 作者列表必须是唯一的 我尝试使用以下命令 但它没有删除重复项 并且每行输出中都有 作者 一词 不需要对输出进行排序 但我希望获得没有任何重复的输出 git
  • 错误:线条魔术函数

    我正在尝试使用 python 读取文件 但不断收到此错误 ERROR Line magic function user vars not found 我的代码非常基本 names read csv Combined data csv nam
  • 使用scrapy到json文件只得到一行输出

    好吧 我对一般编程很陌生 并且具体使用 Scrapy 来实现此目的 我编写了一个爬虫来从 pinterest com 上的 pin 获取数据 问题是我以前从我正在抓取的页面上的所有引脚获取数据 但现在我只获取第一个引脚的数据 我认为问题出在
  • App Engine、PIL 和叠加文本

    我正在尝试在 GAE 上的图像上覆盖一些文本 现在他们公开了 PIL 库 这应该不是问题 这就是我所拥有的 它有效 但我不禁认为我应该直接写入背景图像 而不是创建单独的覆盖图像然后合并 我可以用吗Image frombuffer http
  • Python TDD 目录结构

    Python 中是否有用于 TDD 的特定目录结构 教程讨论测试的内容 但不讨论测试的位置 通过研究 Python Koans 怀疑它是这样的 project main program py This has main method sta

随机推荐

  • 可解码嵌套数据,无需在 Swift 中创建额外的类

    我是 iOS 开发新手 很抱歉提前提出愚蠢的问题 我有这样的 json type post comments count 0 can post 1 likes count 0 user likes 0 can like 1 can publ
  • 指定在另一个文件中声明的全局变量的类型

    我如何告诉我的 IDE PHPStorm 某些全局变量不是 未声明 的 而是简单地在其他地方声明的 并有特定的类型 Magento 的一个例子 opcheckout js if response duplicateBillingInfo s
  • 在 Xcode Interface Builder 中 - 为什么编辑器--->排列菜单中的选项(包含“发送到前面”、“发送到后面”)经常被禁用?

    我想做的很简单 在子视图中的图像前面添加一个标签 但是 当选择我的标签时 所有排列选项都将被禁用 不可选择 我发现这种情况经常发生 我几乎不允许在排列菜单中更改对象的 z 轴 这可能是什么原因 避免此功能并以编程方式设置视图顺序是否是更好的
  • && 逻辑和 || 的 True 和 False逻辑表

    C 语言的真 假表 我听说过 C 语言中有一个表 true false for and or 是一种数学 他们说如果 true true true 且 false true false 我只是对此感到困惑 我尝试进行研究 但找不到任何表格
  • 如何使用 jquery 将自定义标头添加到 ASMX Web 服务调用?

    我有一个具有以下合同的网络服务 POST Service service asmx HTTP 1 1 Host xxx xxx xxx Content Type text xml charset utf 8 Content Length l
  • 此操作将取消挂起的刷新数据命令

    当我尝试此代码时 我收到错误 此操作将取消挂起的刷新数据命令 是否继续 ActiveWorkbook RefreshAll 即使我把Application Wait now TimeValue 00 01 20 Excel 未正确刷新 解决
  • 从 C# 中继承的类转换数据类型

    我试图了解我的统一项目的继承 但似乎发现我的设置存在限制 我在写这篇文章时感到很困惑 因为我仍在学习正确理解 C 我有一组继承的类 它们根据两种不同的行为进行划分 这样我就有了正确的引用 然后我需要对它们进行转换 以便我可以访问这些类之一中
  • Javascript 模块模式有什么好处?

    我一直在研究为我的团队提出标准化的 Javascript 编码风格 现在大多数资源推荐涉及闭包的 模块 模式 如下所示 var Module function someMethod function return someMethod so
  • 不知道为什么在 C# 嗅探器中设置套接字选项时收到错误代码 10022(无效参数)

    我正在编写一个数据包嗅探器作为学习 C Net 4 套接字开发的练习 我的目标是嗅探进出我的计算机的 IP 数据包 我的问题是 在调用 SetSocketOption 时收到错误代码 10022 参数无效 我看不出我哪里有无效的论点 我的计
  • Swift didReceiveRemoteNotification 未调用

    我有一个以 oneSignal 作为推送提供者的应用程序 我可以收到推送通知 效果很好 但如果我尝试访问推送有效负载 我什么也得不到didReceiveRemoteNotification没有被调用 我有以下代码 func applicat
  • 如果隐藏子表则隐藏父 Div(显示:无)

    我尝试在 StackOverflow 和 Google 上进行搜索 找到了一些我认为可行的想法 但似乎没有任何帮助 我正在 SugarCRM Professional 6 5 5 中工作 如果使用 jQuery 隐藏表 显示 无 我试图隐藏
  • 使用 Doctrine 2 自动引用保留字

    有没有办法在使用时自动引用 Doctrine 2 的保留字 entityManager gt find entity id 使用查询生成器时可以完成此操作 但应该有一个全局配置设置来执行此操作 我不想在保留字的注释中指定它 这是我不久前向
  • Java SDK 的 Couchbase 连接超时

    我按照 couchbase 教程连接到远程 couchbase 服务器 但在我尝试打开默认存储桶后 连接超时失败 我已检查是否可以在我的计算机上打开 couchbase 服务器页面 192 xx xx xx 8091 这是我的Java代码
  • 如何使用 css 滤镜获得图像:模糊和锐利边缘?

    我想在悬停时模糊图像 问题是图像的边缘也模糊得令人不快 在 Fiddle 中 您可以在绿色背景下清楚地看到它 如果我缩放图像 即 1 2 它最终会解决问题 但在过渡过程中 模糊的边缘仍然出现 有什么想法如何使边缘具有这种效果 http js
  • HTML5 上传前预先调整图像大小

    这是一个面条刮刀 请记住 我们有 HTML5 本地存储和 xhr v2 等等 我想知道是否有人可以找到一个可行的示例 甚至只是对这个问题给出 是 或 否 是否可以使用新的本地存储 或其他 预先调整图像大小 以便不知道如何调整图像大小的用户可
  • Swift:@objc(...) 属性

    在 Apple 生成的代码中 Core DataNSManagedObject子类 例如 我看到这个 objc LPFile public class LPFile NSManagedObject 我的问题是 为什么是 objc声明如上所述
  • 我需要与多个远程参与者系统进行通信

    我正在使用 akka Net 开发一种插件架构 其中包含一个或多个插件的每个 dll 都被加载到自己的中AppDomain并且新的参与者系统被初始化 准备接收来自 主机 的消息 我试图让它与多个插件一起工作 但我却陷入困境 所以主机配置如下
  • 条形图中的渐变填充

    我正在观察不同人群的行为 称为Clusters在此数据集中 以及他们对所使用的浏览器类型的偏好 我想创建一个条形图 显示使用每种类型浏览器的每个集群的百分比 下面是一些生成类似数据集的代码 请忽略每个簇的百分比加起来不会等于 1 brows
  • Clang++-3.7 CRTP 编译错误“父级模板参数中没有命名成员”

    在下面的代码中 我尝试使用 CRTP 来使用父类中子类的静态成员 值 当使用带有 pedantic 标志的 g 5 2 1 编译代码时 我能够按预期编译 并且在执行时c print value and Child
  • 从包含数百万个文件的目录中精确匹配地高效查找数千个文件 (bash/python/perl)

    我在 Linux 上 试图从包含数百万个文件的目录 SOURCE DIR 中查找数千个文件 我有一个需要查找的文件名列表 存储在单个文本文件 FILE LIST 中 该文件的每一行都包含与 SOURCE DIR 中的文件相对应的单个名称 并