![移动/重命名具有特定文件大小的大量文件](https://linux22.com/image/1120567/%E7%A7%BB%E5%8A%A8%2F%E9%87%8D%E5%91%BD%E5%90%8D%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E6%96%87%E4%BB%B6%E5%A4%A7%E5%B0%8F%E7%9A%84%E5%A4%A7%E9%87%8F%E6%96%87%E4%BB%B6.png)
我从一张坏的 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
或结尾的文件,并打印其大小和文件名。.JPG
bad
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 上运行。