移动/重命名具有特定文件大小的大量文件

移动/重命名具有特定文件大小的大量文件

我从一张坏的 SD 卡上恢复了很多图片(1000 多张)。除了 75 张似乎“损坏”的图片外,其余图片都恢复了。我运行了一个程序,让所有图片在较低级别读取,我发现我得到了所有图片,包括 SD 卡中无法读取的图片,问题是它们以不同的名称恢复,而且很多都是重复的。

我想在“好”文件夹中找到文件(如果有多个,则只获取第一个),并且该文件的大小与“坏”文件夹中的每个文件的大小完全相同,然后用其名称重命名。

我运行了这个命令ls -lR | egrep -v '^d' | awk '$5==5040057{print}'

我得到了这个结果

-rw-r--r-- 1 user user  5040057 Apr  6 04:47 _MG_2443.JPG
-rw-r--r-- 1 user user 5040057 Apr  6 04:47 f11146176.jpg
-rw-r--r-- 1 user user 5040057 Apr  6 04:47 f12072256.jpg
-rw-r--r-- 1 user user 5040057 Apr  6 04:47 f14834560.jpg

编辑:它没有显示在命令的结果中,但文件夹结构如下:

Recovery:
 |- Bad ( containing _MG_XXXX.JPG files )
 |- Good ( Containing fXXXXXXXX.jpg files )

其中第一个 _IMG_2443.JPG 是坏图像,后面的任何图像都是好的(这些是可以重命名或移动的候选图像)。因此,对于前面的示例,我希望将例如文件“f11146176.jpg”在好文件夹中重命名为“_MG_2443.JPG”,以便我可以稍后检查它并将其替换到坏文件夹中。

有没有办法运行命令来自动对所有图片执行此操作?谢谢

答案1

文件大小不是确定重复项的好方法。您可以拥有两个大小完全相同但内容不同的文件。这意味着这种方法很可能会失败。话虽如此,下面的方法将满足您的要求。

重要的:这假设您的文件名没有空格和换行符。

find bad -iname "*.jpg" -printf "%s %f\n" | while read -r bs bf; do 
  find good/ -iname "*.jpg" -printf "%s %f\n" | while read -r gs gf; do 
    [ $bs -eq $gs ] && echo "mv good/$gf good/$bf"; 
  done 
done

解释

  • find bad -iname "*.jpg" -printf "%s %f\n":查找目录中所有名称以.jpg或结尾的文件,并打印其大小和文件名。.JPGbad
  • while read -r bs bf; do:读取上面的每一行输出,将文件的大小保存为,$bs将其名称保存为$bf
  • 第二个find ... | while ...; done对目录执行完全相同的操作good,将文件的大小保存为,$gs将其名称保存为$gf
  • [[ $bs -eq $gs ]] && echo "mv good/$gf good/$bf";:如果坏文件的大小与好文件的大小相同,则使用坏文件的名称重命名好文件。如果这样做符合您的预期,请删除回显并将行更改为简单的mv good/"$gf" good/"$bf"。请注意这将保持最后的“坏”文件名作为“好”文件的最终名称。

我想强调的是,这并不安全,不同的文件可能大小完全相同,但内容却完全不同。与其使用这种幼稚的方法,不如使用专门用于比较图像的程序。我从未使用过任何此类软件,但经过 3 分钟的搜索,我发现杜佩古鲁。建议你先尝试一下:

杜佩古鲁:dupeGuru 图片版(简称 PE)是一个用于查找计算机上重复图片的工具。dupeGuru PE 是 dupeGuru 的老大哥。

该软件的工作方式与 dupeGuru 相似,但专门用于重复图片匹配。dupeGuru PE 可在 Windows、Mac OS X 和 Linux 上运行。

相关内容