Jak usunąć „nieużywane” nieprzetworzone pliki, które nie pasują do formatu .jpg?

10

Fotografuję RAW + JPG, a mianowicie NEF i JPG. Po obejrzeniu czasami setek zdjęć (przy użyciu prostego programu) i usunięciu plików JPG mam wiele niepotrzebnych plików NEF. Jeśli w katalogu byłby skrypt do usuwania osieroconych plików NEF, byłoby to bardzo pomocne. Przeczytałem tutaj podobne pytanie „ Jak usunąć pliki JPG, ale tylko jeśli istnieje zgodny plik RAW? ”, A rozwiązanie przedstawione w wierszu polecenia działa bardzo dobrze. Zastanawiałem się, czy jedna z nich była dostępna w moim położeniu?

Al H.
źródło
Czy możesz podać tutaj link do tego pytania? Odpowiedzią na to będzie prawie na pewno skrypt powłoki - może zamiast tego zapytaj SuperUser, ponieważ jeśli masz dobrą definicję tego, co musisz usunąć (według nazwy pliku), jest to dość trywialne zadanie.
Ben Parsons,
1
W przyszłości skorzystaj z Geeqie. Automatycznie usuwa pasujące pliki RAW i wszystkie inne, które są zdefiniowane jako plik „sidecar” na podstawie konfiguracji.
Itai
Mam konfigurację w następujący sposób: NEF: \\ Zdjęcia \ RAW \ RRRR \ RRRR-MM-DD \ original.nef Jpegs: \\ Zdjęcia \ RAW \ RRRR \ RRRR-MM-DD \ original.jpeg W każdym razie mogę to zastosować skrypt do tego?
W Bash: sierota = .nef; rodzic = .jpeg; dla f w * „$ sieroce”; do F = „$ {f% $ sierota} $ rodzic”; jeśli test! -f „$ F”; następnie echo „Zidentyfikowany sierota: $ f istnieje, ale nie $ F”; fi gotowe Nie mogę uwierzyć, jak długie i skomplikowane są te inne odpowiedzi. Tak, wiem, odpowiadając w komentarzu, ale jest chroniony ...
Nikt

Odpowiedzi:

9

Napisałem skrypt w Pythonie, aby wykonał za mnie pracę. Nazywa się remove-orphaned-raw-images.pyi opublikowałem go na Github .

Zasadniczo iteruje wszystkie pliki w danym folderze i przenosi osierocone surowe obrazy (w moim przypadku *.CR2pliki bez pasującego JPEG) do folderu kopii zapasowej. Opcjonalnie możesz nakazać skryptowi, aby faktycznie usunął pliki.

Oto zarys algorytmu:

  • Uzyskaj listę wszystkich plików w wybranym katalogu.
  • Posortuj te pliki do plików RAW i JPEG (dołącz je do osobnych list).
  • Sprawdź, czy dla każdej pozycji na liście zdjęć RAW istnieje zgodność na liście JPEG;
    jeśli nie, dołącz ten obraz do listy osieroconych obrazów surowych.
  • Przenieś obrazy z listy osieroconych obrazów do folderu kopii zapasowej
    (lub usuń je bezpośrednio, jeśli jest to wyraźnie wymagane).

Narzędzie powie ci, jak go używać, gdy jest uruchamiany z opcją pomocy -hw wierszu poleceń.

Ten problem również mi się przydarzył i dlatego napisałem to narzędzie. Używam mojej lustrzanki do robienia zdjęć JPEG lub RAW + JPEG, nigdy tylko RAW. Podczas sortowania rozmytych lub w inny sposób złych ujęć używam plików JPEG, aby szybko na nie spojrzeć i usunąć te złe. Pozostają mi zdjęcia RAW, z których usunąłem pasujące pliki JPEG (z jakiegoś powodu).

pklaus
źródło
5

Korzystając z pytania, o którym wspomniałeś - napisałem ci skrypt

ok ostrzeżenie! bądź ostrożny z tym skryptem! - Zrób kopię zapasową

1) Utwórz plik nietoperza o nazwie clean.bat i umieść go w katalogu, z którym chcesz pracować

2) Następnie wprowadź następujące dane do pliku nietoperza

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) Otwórz wiersz polecenia jako administrator i przejdź do folderu z plikiem clean.bat 4) uruchom clean.bat

Zasadniczo przepływ skryptu jest

  • Utwórz katalog o nazwie Keep
  • Przenieś wszystkie pasujące pliki NEF do folderu zachowaj
  • Przenieś wszystkie pliki JPEG do folderu Keep
  • Następnie usuń wszystkie pliki z folderu źródłowego
  • Przenieś zachowaj pliki z powrotem
  • Usuń folder zachowania

PROSZĘ przetestować to!

AKTUALIZACJA: Zmieniono skrypt do pracy z folderami, w których są spacje

Obrabować
źródło
2
+1 za proste rozwiązanie za jednym strzałem! Potrzebowałem tego rozwiązania od dłuższego czasu. Kiedyś opracowywałem polecenia, wklejając dane wyjściowe DIR do programu Excel i używając skomplikowanych operatorów, takich jak vlookup, do generowania poszczególnych poleceń, ale to zaspokaja prawie wszystkie moje potrzeby. Przetestowałem skrypt i jest dla mnie całkowicie w porządku. Musiałem zapoznać się z kilkoma referencjami, aby w pełni zrozumieć skrypt i móc go zmodyfikować dla innych podobnych operacji.
Jahaziel
Fantastycznie, oszczędziłeś mi godzin żmudnej pracy !!! Próbowałem kilka razy i działa zbyt szybko. Właśnie tego szukałem.
Al H
@ al-h - czy możesz zaznaczyć poprawne? dzięki
Rob
Rob Nie jestem pewien, co rozumiesz przez „proszę zaznaczyć poprawne” Nie widzę gdzieś, gdzie mogę sprawdzić poprawny link.
Al H
Jedną rzecz zauważyłem. To nie działa na folderach na pulpicie (usuwa wszystkie pliki jpg i NEF), więc najpierw przetestuj. Korzystam z systemu Windows XP Pro.
Al H
1

Oto mój skrypt Pythona, aby usunąć cr2 w / oa jpeg.

Przeszukuje rekurencyjnie w bieżącym katalogu „.”. Uwzględnia wszystkie obrazy we wszystkich folderach.

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")
Peter Pete
źródło
Po prostu zmień nazwę „.cr2” na „.nef”
Peter pete
Nie znam Python, ale widzę, że w ostatnim wierszu odnosi się do „pause.exe”. Czy to oznacza, że ​​działa tylko w systemie Windows? Myślałem, że Python był niezależny od platformy.
Saaru Lindestøkke
Dzień Program pause.exe wstawiłem tylko po to, aby Python nie zniknął, gdy tylko zakończy działanie, po dwukrotnym kliknięciu go w Eksploratorze. Możesz usunąć tę linię i voila będzie niezależna od platformy. Używanie rzeczy zależnych od systemu operacyjnego jest złą praktyką, a ponieważ początkowo napisałem to dla siebie, byłem leniwy: D Przynajmniej nie łączyłem ścieżek z naiwnymi ukośnikami ani nie korzystałem z funkcji usuwania plików specyficznych dla systemu operacyjnego.
Peter pete
Jest także napisany dla wersji Python 3.x. Jeśli chcesz, aby był przyjazny dla systemu 2.x, po prostu zmień cały druk („coś”), aby wydrukować „coś”
Peter Pete,