Як видалити "невикористані" сировинні файли, які не відповідають .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.