gpt4 book ai didi

linux - 使用多个搜索模式列表在多个 .png 文件名中搜索并将结果复制到新文件夹

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:23 26 4
gpt4 key购买 nike

我有一个名为 search.txt 的文件,其中包含多个搜索模式

示例“search.txt”(总共超过 300 个条目):

A28
A32
A3C
A46
A50
A5A
898
8A2
8AC
8B6
8C0

我要搜索的文件夹中的示例文件(总共超过 5000 个):

 1_0_1_4AB_3_56_300000_0_0_0.png
1_0_1_5A0_20_56_300000_0_0_0.png
1_0_1_A28_22_56_300000_0_0_0.png
1_0_1_A32_22_56_300000_0_0_0.png
1_0_1_A96_23_56_300000_0_0_0.png
1_0_1_898_21_56_300000_0_0_0.png

我需要根据 search.txt 中的所有条目检查所有 .png 的第四个字符串(字符串由“_”分隔)我之前使用过类似的 perl 脚本:

match4th.pl

#!/usr/bin/perl -w
use strict;
my $pat = qr/$ARGV[0]/;
while (<STDIN>) {
my (undef, undef, undef, $fourth) = split /_/;
print if defined($fourth) && $fourth =~ $pat;
}

然后我会使用类似这样的东西来执行脚本并将匹配的文件移动到新位置:

cd /png_folder
find . -name '*.png' | perl match4th.pl '/tmp/search.txt' | xargs mv -t /tmp/results

我不确定的部分是如何告诉 find 命令使用/tmp/search.txt 中的所有条目,而不是将每个模式写入 find 命令我也更愿意复制文件而不是移动它们

最佳答案

您可以直接将 search.txt 文件用作 grep 的模式列表:

find . -name '*.png' | grep -f search.txt | xargs ...

或者如果你想让模式更严格,你可以这样做:

find . -name '*.png' | grep -f <(sed s/^/[0-9]_[0-9]_[0-9]_/ search.txt)

或更严格:

find . -name '*.png' | grep -f <(sed s?^?/[0-9]_[0-9]_[0-9]_? search.txt)

甚至更严格:

find . -name '*.png' | grep -f <(sed 's?.*?/[0-9]_[0-9]_[0-9]_&_?' search.txt)

在最后一个中,匹配了 search.txt 中的整行 (.*),并且在替换中我们使用模式前缀 /[ 0-9]_[0-9]_[0-9]_,后跟匹配的字符串 (&),然后是 _。因此,例如,如果您将字母 A 作为 search.txt 中的模式,这将为该行生成一个模式作为 /[0-9]_ [0-9]_[0-9]_A_,它将正确匹配您的文件与那里的 _A_

如果输出看起来不错,您可以将其通过管道传输到 xargs 以像这样复制匹配的文件:

... | xargs -i{} cp {} /path/to/dir

关于linux - 使用多个搜索模式列表在多个 .png 文件名中搜索并将结果复制到新文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20358693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com