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

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

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

Ответы (3)

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

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

Вот набросок алгоритма:

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

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

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

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

хорошо предупреждение! будьте осторожны с этим скриптом! - СДЕЛАЙТЕ БЭКАП

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 в папку хранения
  • Затем удалите все файлы из исходной папки
  • Вернуть сохраненные файлы обратно
  • Удалить папку сохранения

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

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

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

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