Як видалити "невикористані" сировинні файли, які не відповідають .jpg?


10

Я знімаю RAW + JPG, а саме NEF та JPG. Переглядаючи іноді сотні зображень (за допомогою простої програми) та видаляючи JPG, у мене є багато непотрібних файлів NEF. Якщо був би сценарій для видалення будь-яких сирітських файлів NEF в каталозі, це було б дуже корисно. Я читав подібне запитання тут " Як видалити файли JPG, але лише за наявності відповідного файлу RAW? ", І рішення, представлене в командному рядку, працює дуже добре. Мені було цікаво, чи є хтось із моїх проблем?


Чи можете ви надати посилання на це питання тут? Відповіддю на це майже напевно буде сценарій оболонки - можливо, запитайте замість SuperUser, тому що якщо у вас є чітке визначення того, що потрібно видалити (за назвою файлу), це досить тривіальна задача.
Бен Парсонс

1
На майбутнє просто використовуйте Geeqie. Він автоматично видаляє відповідні файли RAW та будь-який інший, який визначається як файл "коляска" на основі конфігурації.
Itai

У мене налаштування наступні: NEF: \\ Фотографії \ RAW \ YYYY \ YYYY-MM-DD \ original.nef Jpegs: \\ Фотографії \ RAW \ YYYY \ YYYY-MM-DD \ original.jpeg Я все одно можу застосувати це сценарій до цього?

У Баші: сирота = .nef; батьків = .jpeg; для f в * "$ сирота"; do F = "$ {f% $ сирота} $ батьків"; якщо тест! -f "$ F"; потім відлуння "Ідентифікована сирота: $ f існує, але не $ F"; fi done Не можу вірити, наскільки тривалими та складними є інші відповіді. Так, я знаю, відповідаючи в коментарі, але це захищено ...
Ніхто

Відповіді:


9

Я написав сценарій в Python, щоб зробити роботу за мене. Це називається, remove-orphaned-raw-images.pyі я опублікував це на Github .

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

Ось контур алгоритму:

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

Інструмент підкаже вам, як його використовувати під час запуску з довідковою -hкомандою у командному рядку.

Ця проблема також сталася зі мною, саме тому я написав цей інструмент. Я використовую свій DSLR для зйомки зображень JPEG або RAW + JPEG, а не лише RAW. Під час сортування розмитих або інакших поганих знімків я використовую JPEG, щоб швидко переглянути їх та видалити погані. Це залишає мені залишені зображення RAW, з яких я видалив відповідні JPEG (не просто так).


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 у папку Keep
  • Перемістіть усі Jpegs у папку Keep
  • Потім видаліть усі файли з вихідної папки
  • Перемістіть файли збереження назад
  • Видаліть папку Keep

Будь ласка, просимо перевірити це!

ОНОВЛЕННЯ: Зроблено зміну сценарію для роботи з папками, у яких є пробіли


2
+1 для прямого, одного рішення! Мені давно потрібне це рішення. Раніше я розробляв команди, вставляючи вихід DIR в excel і використовуючи складні оператори, такі як vlookup, для генерації окремих команд, але це задовольняє майже всі мої потреби. Випробував сценарій і його повністю чудово для мене. Довелося проконсультуватися з кількома посиланнями, щоб повністю зрозуміти скрипт і мати змогу модифікувати його для інших подібних операцій.
Джагазіель

Фантастично, ти врятував мені години копіткої роботи !!! Я спробував це кілька разів, і це працює занадто швидко. Це саме те, що я шукав.
Al H

@ al-h - будь ласка, ви можете поставити галочку як правильну тоді? дякую
Роб

Роб, я не впевнений, що ви маєте на увазі під "підкажіть, будь ласка, позначте як правильно". Я не бачу десь, я можу перевірити правильність посилання.
Al H

Одне я помітив. Це не працює для папок на робочому столі (видаляє всі файли jpg та NEF), тому спершу протестуйте. Я запускаю Windows XP Pro.
Al H

1

Ось мій скрипт python для видалення j / з crpe's 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 не зникав, як тільки його закінчив, після того, як я двічі клацнув його на Explorer. Ви можете видалити цю лінію і вуалі вона буде незалежною від платформи. Використовувати залежні від ОС речі - це погана практика, і оскільки я спочатку писав це для мене, я лінувався: D Принаймні, я не поєднував шляхи з наївними нарізками, а також не використовував специфічні для видалення файли функції.
Пітер Піт

Він також написаний для версій Python 3.x. Якщо ви хочете, щоб це було дружньо 2.x, просто змініть весь друк ("щось"), щоб надрукувати "щось"
Пітер Піт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.