Как удалить «неиспользуемые» необработанные файлы, которые не соответствуют .jpg?

10

Я снимаю RAW + JPG, а именно NEF и JPG. После просмотра иногда сотен изображений (с помощью простой программы) и удаления файлов JPG у меня появляется много ненужных файлов NEF. Если бы в каталоге был скрипт для удаления любых потерянных файлов NEF, это было бы очень полезно. Я прочитал похожий вопрос здесь « Как удалить файлы JPG, но только если существует соответствующий файл RAW? », И решение, представленное в командной строке, работает очень хорошо. Мне было интересно, если один был доступен для моего затруднительного положения?

Аль Н
источник
Можете ли вы дать ссылку на этот вопрос здесь? Ответом на это почти наверняка будет сценарий оболочки - возможно, спросите вместо этого SuperUser, потому что если у вас есть хорошее определение того, что вам нужно удалить (по имени файла), это довольно тривиальная задача.
Бен Парсонс
1
На будущее просто используйте Geeqie. Он автоматически удаляет совпадающие файлы RAW и любые другие, которые определяются как файл 'sidecar' на основе конфигурации.
Итай
У меня есть следующие настройки: NEF: \\ Photos \ RAW \ YYYY \ YYYY-MM-DD \ original.nef Jpegs: \\ Photos \ RAW \ YYYY \ YYYY-MM-DD \ original.jpeg В любом случае я могу применить это сценарий к этому?
В Баш: сирота = .nef; Родитель = .jpeg; для f в * "$ orphan"; do F = "$ {f% $ orphan} $ parent"; если проверить! -f "$ F"; затем эхо "Идентифицированная сирота: $ f существует, но не $ F"; Я не могу поверить, как долго и сложно эти другие ответы. Да, я знаю, отвечая в комментарии, но это защищено ...
Никто

Ответы:

9

Я написал скрипт на Python, чтобы сделать работу за меня. Это называется, remove-orphaned-raw-images.pyи я опубликовал его на Github .

По сути, он перебирает все файлы в данной папке и перемещает необработанные необработанные изображения (в моем случае *.CR2файлы без соответствующего JPEG) в резервную папку. При желании вы можете указать сценарию, чтобы он действительно удалял файлы.

Вот схема алгоритма:

  • Получить список всех файлов в выбранном каталоге.
  • Сортируйте эти файлы в файлы RAW и JPEG (добавляйте их в отдельные списки).
  • Проверьте для каждого элемента в списке изображений RAW, что совпадение существует в списке JPEG;
    если нет, добавьте это изображение в список необработанных необработанных изображений.
  • Переместите изображения из списка потерянных изображений в резервную папку
    (или сразу удалите их, если явно требуется ).

Инструмент расскажет вам, как использовать его при запуске с параметром справки -hв командной строке.

Эта проблема также произошла со мной, поэтому я написал этот инструмент. Я использую цифровую зеркальную фотокамеру для съемки изображений в формате JPEG или RAW + JPEG, а не только в формате RAW. При сортировке размытых или других плохих снимков я использую файлы JPEG, чтобы быстро взглянуть на них и удалить плохие. Это оставляет меня с оставшимися изображениями RAW, из которых я удалил соответствующие JPEG (по причине).

pklaus
источник
5

Используя вопрос, который вы упомянули - я написал вам сценарий

хорошо, предупреждение! будьте осторожны с этим сценарием! - СДЕЛАЙТЕ РЕЗЕРВНОЕ КОПИРОВАНИЕ

1) Создайте bat-файл с именем clean.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 в папку хранения
  • Переместить все JPEG в папку хранения
  • Затем удалите все файлы из исходной папки
  • Переместить файлы обратно
  • Удалить папку хранения

Пожалуйста, ПОЖАЛУЙСТА, проверьте это!

ОБНОВЛЕНИЕ: Изменен скрипт для работы с папками, в которых есть пробелы

обкрадывать
источник
2
+1 за простое, одноразовое решение! Мне давно нужно это решение. Раньше я разрабатывал команды, вставляя вывод DIR в Excel и используя сложные операторы, такие как vlookup, для генерации отдельных команд, но это удовлетворяет почти все мои потребности. Протестировал сценарий, и он полностью мне подходит. Пришлось обратиться к нескольким ссылкам, чтобы полностью понять скрипт и иметь возможность модифицировать его для других подобных операций.
Джахазиил
Фантастика, ты сэкономил мне часы утомительной работы !!! Я пробовал это несколько раз, и это работает слишком быстро. Это именно то, что я искал.
Al H
@ al-h - не могли бы вы поставить галочку? спасибо
Роб
Роб Я не уверен, что ты имеешь в виду под «пожалуйста, отметьте, пожалуйста, как правильно». Я не вижу где-нибудь, я могу проверить правильную ссылку.
Al H
Я заметил одну вещь. Это не работает с папками на рабочем столе (удаляет все файлы jpg и NEF), поэтому сначала протестируйте. Я использую Windows XP Pro.
Al H
1

Вот мой скрипт на python для удаления cr2 без 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 не зависит от платформы.
Saaru Lindestøkke
Gday. Файл pause.exe, который я вставил, только для того, чтобы python thingo не исчезал, как только он завершил выполнение, после того, как я дважды щелкнул по нему в проводнике. Вы можете удалить эту строку и вуаля, она будет независимой от платформы. Использование OS-зависимых вещей - плохая практика, и, так как я изначально написал это для себя, я был ленив: D По крайней мере, я не объединял пути с наивными слешами и не использовал специальные функции удаления-файла.
Питер Пит
Он также написан для версий Python 3.x. Если вы хотите, чтобы он был дружественным к 2.x, просто измените всю печать («что-то»), чтобы напечатать «что-то»
Питер Пит