Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 按前缀查找重复文件(不是哈希)_Linux - Fatal编程技术网

Linux 按前缀查找重复文件(不是哈希)

Linux 按前缀查找重复文件(不是哈希),linux,Linux,如果我有两个文件,其中一个是: 2020-07-03-21_56_51-a.jpg 另一个: 2020-07-03-21_56_51-b.jpg 这些都是相同的文件,例如fdupes。不承认它们是重复的 如何匹配timedate格式并将其打印为可能的副本?您可以迭代a文件并搜索相应的b文件: #! /bin/bash for filea in ????-??-??-??_??_??-a.jpg ; do fileb=${filea%-a.jpg}-b.jpg if [[ -f

如果我有两个文件,其中一个是:

2020-07-03-21_56_51-a.jpg
另一个:

2020-07-03-21_56_51-b.jpg
这些都是相同的文件,例如fdupes。不承认它们是重复的


如何匹配timedate格式并将其打印为可能的副本?

您可以迭代a文件并搜索相应的b文件:

#! /bin/bash
for filea in ????-??-??-??_??_??-a.jpg ; do
    fileb=${filea%-a.jpg}-b.jpg
    if [[ -f $fileb ]] ; then
        echo Found "$filea" "$fileb"
    else
        echo Not found the b file for "$filea"
    fi
done
您还可以使用comm处理a文件和b文件列表。b文件更改为类似于a文件,因此comm将以三列报告输出:1。找不到b文件,2。找不到a文件,3。两个文件都存在

comm <(ls ????-??-??-??_??_??-a.jpg) \
     <(ls ????-??-??-??_??_??-b.jpg | sed 's/-b\.jpg/-a.jpg/')

显示的时间格式在文件名上形成一个19个字符长的前缀。如果我们假设您不需要处理其他前缀,那么您可以将这些文件的列表通过管道传输到以下perl脚本,如ls*.jpg | perl first19match.pl

将以下代码保存在名为first19match.pl的文件中

输出为:

possible duplicates:
2020-07-03-21_56_51-a.jpg
2020-07-03-21_56_51-b.jpg

possible duplicates:
2020-07-03-21_50_34-fhv.asd
2020-07-03-21_50_34-cubj.tgg

您可以尝试使用perl oneliner,它根据文件名中u之前的时间戳将文件列表推送到哈希列表中

ls 2020* | perl -F"_" -lane 'push @{$list{$F[0]}}, $_; END { foreach $k (keys %list) { print join ",", "duplicates?", @{$list{$k}} } }'

相同的文件是什么意思?它们的内容是一样的吗?或者你只想通过时间戳来匹配它们,而不管它们的内容是什么?@choroba文件略有不同,这意味着我无法比较它们的哈希值。我想要的是打印这两个文件名,因为前缀everything to-a,-b都是相同的@BryanK,尽管我同意至少应该有最小的可复制示例,但我认为我在我的示例中已经很好地解释了我需要什么。虽然有-a和-b文件,但我没有找到上面的bash脚本。is else语句不应该颠倒吗?它对我很有用。我最初在脚本中有一个输入错误,请检查您是否有最新版本。在文件夹ls->2020-07-03-21_56_51-a.jpg 2020-07-03-21_56_52-b.jpg->not found未找到2020-07-03-21_56_51-a.jpgYes中的这两个文件,这是预期的,51!=你说得对,我试图重现我的第一次尝试时犯了错误。但我现在又试了一次,以前也试过多次,但还是没有找到
possible duplicates:
2020-07-03-21_56_51-a.jpg
2020-07-03-21_56_51-b.jpg

possible duplicates:
2020-07-03-21_50_34-fhv.asd
2020-07-03-21_50_34-cubj.tgg
ls 2020* | perl -F"_" -lane 'push @{$list{$F[0]}}, $_; END { foreach $k (keys %list) { print join ",", "duplicates?", @{$list{$k}} } }'