如何删除没有.jpg匹配项的“未使用”原始文件?


10

我拍摄RAW + JPG,即NEF和JPG。在查看了数百张图像(使用一个简单的程序)并删除JPG之后,我有了许多不必要的剩余NEF文件。如果有脚本删除目录中的所有孤立NEF文件,那将非常有帮助。我在这里读到了一个类似的问题:“ 如何删除JPG文件,但仅在匹配的RAW文件存在的情况下? ”,并且与命令提示符一起提供的解决方案效果很好。我想知道是否有人可以解决我的困境?


您可以在此处提供该问题的链接吗?答案几乎肯定是外壳脚本-也许要问SuperUser,因为如果您对要删除的内容有很好的定义(按文件名),这是一项相当琐碎的任务。
Ben Parsons

1
对于未来,只需使用Geeqie。它会根据配置自动删除匹配的RAW文件以及所有其他定义为“ sidecar”文件的文件。
Itai 2012年

我的设置如下:NEF:\\ Photos \ RAW \ YYYY \ YYYY-MM-DD \ original.nef Jpegs:\\ Photos \ RAW \ YYYY \ YYYY-MM-DD \ original.jpeg无论如何我都可以应用脚本吗?

在Bash中:orphan = .nef; parent = .jpeg; 对于*“ $ orphan”中的f;做F =“ $ {f%$ orphan} $ parent”; 如果测试!-f“ $ F”; 然后回显“已识别的孤儿:$ f存在,但不存在$ F”;fi完成无法相信其他答案的持续时间和复杂程度。是的,我知道,我在评论中回答,但受到保护了……
没人

Answers:


9

我用Python编写了一个脚本来为我完成工作。它被称为remove-orphaned-raw-images.py,我在Github上发布了它。

基本上,它会遍历给定文件夹中的所有文件,然后将孤立的原始图像(在我的情况下是*.CR2与JPEG不匹配的文件)移动到备份文件夹中。(可选)您可以告诉脚本实际删除文件。

这是算法的概述:

  • 获取所选目录中所有文件的列表。
  • 将这些文件分类为RAW和JPEG文件(将它们追加到单独的列表中)。
  • 检查RAW图像列表中的每个项目,以确定JPEG列表中是否存在匹配项;
    如果不是,请将此图像附加到孤立的原始图像列表中。
  • 将孤立图像列表中的图像移动到备份文件夹
    (或在明确需要时直接将其删除)。

-h在命令行上使用帮助选项运行时,该工具将告诉您如何使用它。

我也遇到了这个问题,这就是我编写此工具的原因。我正在使用DSLR拍摄JPEG或RAW + JPEG图像,而不仅仅是RAW。在整理模糊或其他不良照片时,我使用JPEG快速查看它们并删除不良照片。这使我留下了删除了匹配的JPEG的RAW图像(有原因)。


5

使用您提到的问题-我已经为您编写了一个脚本

好的警告!小心此脚本!-进行备份

1)制作一个名为clean.bat的bat文件,并将其放在您要使用的目录中

2)然后在bat文件中输入以下内容

mkdir keep
for /f "delims==" %%r in ('dir /b *.jpg') do move "%%~dpr%%~nr.nef" "%CD%\keep\" 2> nul
move *.jpg "%CD%\keep\"
del *.nef
del *.jpg
move "%CD%\keep\*.*" "%CD%\"
rmdir keep

3)以管理员身份打开命令提示符,并导航到带有clean.bat的文件夹4)运行clean.bat

基本上,脚本的流程是

  • 创建一个名为Keep的目录
  • 将所有匹配的NEF文件移动到keep文件夹
  • 将所有Jpegs移至keep文件夹
  • 然后从源文件夹中删除所有文件
  • 移回保留文件
  • 删除保留文件夹

请,请测试一下!

更新:对脚本进行了更改,以处理其中包含空格的文件夹


2
+1是一种简单易用的解决方案!我长期以来一直需要这种解决方案。我以前通过将DIR输出粘贴到excel中并使用诸如vlookup之类的复杂运算符来生成单个命令来详细说明命令,但这几乎满足了我的所有需求。测试了脚本,并且对我来说完全没问题。必须查阅一些参考资料才能完全理解该脚本,并能够针对其他类似操作对其进行修改。
Jahaziel 2012年

太棒了,您为我节省了数小时的繁琐工作!!!我试了几次,它的速度太快了。这正是我想要的。
Al H

@ al-h-请您勾选正确吗?谢谢
Rob

Rob,我不确定“请打勾是否正确”的意思,我看不到可以检查正确链接的地方。
Al H

我确实注意到了一件事。这不适用于桌面上的文件夹(删除所有jpg和NEF文件),因此请先进行测试。我正在运行Windows XP Pro。
Al H

1

这是我的python脚本,用于删除cr2的w / oa jpeg。

它在当前目录“。”内递归搜索。它考虑所有文件夹中的所有图像。

import os 
import sys

#Searches through the current directory, recursively, looking for any raw
#and jpeg files. It enumerates the jpegs it finds, without the extension, and
#then enumerates the raw files it finds. If it finds a raw file for which no
#jpeg exists, then it deletes the raw file.
#
# This WILL NOT WORK, if there are files with repeated file numbers.
# this will NOT be an issue if there's only one camera. 

# A dict of filename: (rawpath, jpegpath)
files_seen = {}

for (cur_dir, subdirs, files) in os.walk("."):
  for file in files:
    fname, fext = os.path.splitext(file)
    fext = fext.lower()



    if (fext == ".jpg"):
      content = files_seen.setdefault(fname, [None, None])
      # if it is then filenames have du'ped
      assert(content[1] is None)
      content[1] = os.path.join(cur_dir, file)

    elif (fext == ".cr2"):
      content = files_seen.setdefault(fname, [None, None])
      assert(content[0] is None)
      content[0] = os.path.join(cur_dir, file)

#at the end, we look for raw files without a jpeg,

for key in files_seen:
  (raw_path, jpeg_path) = files_seen[key]

  if jpeg_path is None:
    print("Deleting: %s" % raw_path)
    #os.system("pause.exe")    
    os.unlink(raw_path)

print("Done")
os.system("pause.exe")

只需将“ .cr2”重命名为“ .nef”
彼得·皮特

我不熟悉Python,但我看到它在最后一行中引用了“ pause.exe”。这是否意味着它仅适用于Windows?我虽然说Python是平台无关的。
SaaruLindestøkke2013年

Gday。我只输入了pause.exe,以便在我在资源管理器中双击它后,python something不会在完成执行后立即消失。您可以随意删除该线路,并且它是独立于平台的。使用os依赖的东西是不好的做法,并且因为我最初是为我编写它的,所以我很懒:D至少我没有用幼稚的斜杠连接路径,也没有使用os特定的delete-file函数。
彼得·皮特

它也是为Python 3.x版本编写的。如果您希望它对2.x友好,只需将所有print(“ something”)更改为print“ something”
Peter pete 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.