.jpg와 일치하지 않는“사용하지 않은”원시 파일을 삭제하는 방법?


10

RAW + JPG, 즉 NEF와 JPG를 촬영합니다. 간혹 수백 개의 이미지 (간단한 프로그램 사용)를보고 JPG를 삭제 한 후 불필요한 남은 NEF 파일이 많이 있습니다. 디렉토리에서 고아 NEF 파일을 삭제하는 스크립트가 있다면 매우 유용합니다. 나는 " JPG 파일을 삭제하는 방법이지만 일치하는 RAW 파일이 존재하는 경우에만? "과 비슷한 질문을 읽었 으며 명령 프롬프트와 함께 제시된 솔루션은 매우 잘 작동합니다. 내가 처한 상황에 처할 수 있는지 궁금합니다.


여기서 그 질문에 대한 링크를 제공 할 수 있습니까? 이것에 대한 대답은 거의 확실하게 쉘 스크립트가 될 것입니다. 대신 슈퍼 유저에게 물어보십시오. 파일 이름으로 삭제해야 할 대상에 대한 올바른 정의가 있다면 이는 매우 사소한 작업이기 때문입니다.
벤 파슨

1
앞으로는 Geeqie를 사용하십시오. 일치하는 RAW 파일과 구성을 기반으로 '사이드카'파일로 정의 된 다른 파일을 자동으로 삭제합니다.
Itai

NEF : \\ Photos \ RAW \ YYYY \ YYYY-MM-DD \ original.nef Jpegs : \\ Photos \ RAW \ YYYY \ YYYY-MM-DD \ original.jpeg 어쨌든 적용 할 수 있습니다. 이것에 대한 스크립트?

Bash에서 : orphan = .nef; 부모 = .jpeg; * "$ orphan"에서 f의 경우; F = "$ {f % $ orphan} $ parent"; 테스트하면! -f "$ F"; echo "식별 된 고아 : $ f는 존재하지만 $ F는 아닙니다"; fi done 다른 답변이 얼마나 길고 복잡한 지 믿을 수 없습니다. 그래, 나도 알아, 대답하고 있지만 보호되어 ...
아무도

답변:


9

나는 나를 위해 일을하기 위해 파이썬 으로 스크립트를 작성했다 . 호출 remove-orphaned-raw-images.py되었고 Github에 게시했습니다 .

기본적으로 주어진 폴더의 모든 파일을 반복하고 고아 원시 이미지 (필요한 *.CR2JPEG가없는 파일)를 백업 폴더로 옮깁니다 . 선택적으로 스크립트가 실제로 파일을 삭제하도록 지시 할 수 있습니다.

알고리즘의 개요는 다음과 같습니다.

  • 선택한 디렉토리의 모든 파일 목록을 가져옵니다.
  • 해당 파일을 RAW 및 JPEG 파일로 정렬하십시오 (별도의 목록에 추가).
  • RAW 이미지 목록의 각 항목이 JPEG 목록에 일치하는지 확인하십시오.
    그렇지 않은 경우이 이미지를 고아 원시 이미지 목록에 추가하십시오.
  • 분리 된 이미지 목록의 이미지를 백업 폴더로 이동
    하거나 명시 적으로 원하는 경우 직접 삭제하십시오.

도구는 -h명령 행 에서 help 옵션 으로 실행할 때 도구 사용법을 알려줍니다 .

이 문제는 나에게도 발생했기 때문에이 도구를 작성했습니다. DSLR을 사용하여 JPEG 또는 RAW + JPEG 이미지를 촬영하고 RAW 만 사용하지는 않습니다. 흐릿하거나 잘못된 사진을 분류 할 때 JPEG를 사용하여 빠르게 사진을보고 잘못된 사진을 삭제합니다. 이것은 RAW 이미지를 남겨두고 일치하는 JPEG를 삭제했습니다 (이유로 인해).


5

당신이 언급 한 질문을 사용하여-나는 당신에게 스크립트를 작성했습니다

알았어 경고! 이 스크립트를 조심하십시오! -백업하기

1) clean.bat라는 박쥐 파일을 만들고 작업하려는 디렉토리에 넣으십시오.

2) 그런 다음 박쥐 파일에 다음을 입력하십시오.

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 파일을 보관 폴더로 이동
  • 모든 Jpegs를 유지 폴더로 이동
  • 그런 다음 소스 폴더에서 모든 파일을 삭제하십시오.
  • Keep 파일을 다시 이동
  • 보관 폴더 제거

이걸 시험해주세요!

업데이트 : 공백이있는 폴더에서 작동하도록 스크립트 변경


2
간단하고 원샷 솔루션 인 경우 +1! 이 솔루션이 오랫동안 필요했습니다. DIR 출력을 Excel에 붙여 넣고 vlookup과 같은 복잡한 연산자를 사용하여 개별 명령을 생성하여 명령을 정교하게 사용했지만 거의 모든 요구를 충족시킵니다. 스크립트를 테스트하고 완전히 괜찮습니다. 스크립트를 완전히 이해하고 다른 유사한 작업을 위해 스크립트를 수정할 수 있도록 여러 참조를 참조해야했습니다.
Jahaziel

환상적인, 당신은 지루한 작업의 시간을 절약했습니다! 여러 번 시도했지만 너무 빨리 작동합니다. 내가 찾던 것입니다.
Al H

@ al-h-그때 당신이 올바른대로 틱 할 수 있습니까? 감사합니다
Rob

롭 나는 당신이 무슨 말을하는지 정확한지 모르겠다. 정확한 링크를 확인할 수있는 곳이 없다.
Al H

내가 알아 차린 한 가지. 데스크탑의 폴더에서는 작동하지 않으므로 (모든 jpg 및 NEF 파일이 삭제됨) 먼저 테스트하십시오. Windows XP Pro를 실행하고 있습니다.
Al H

1

다음은 cr2의 w / oa 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")

그냥 ".nef"에서 ".CR2"의 이름을 변경
피터 피트

파이썬에 익숙하지 않지만 마지막 줄에서 "pause.exe"를 참조하는 것을 알 수 있습니다. 이것은 Windows에서만 작동한다는 것을 의미합니까? 나는 파이썬이 플랫폼 독립적이었습니다.
Saaru Lindestøkke

Gday. pause.exe는 탐색기에서 두 번 클릭 한 후 실행이 완료되는 즉시 파이썬 일이 사라지지 않도록 넣었습니다. 당신은 thsi 라인을 자유롭게 제거 할 수 있으며 플랫폼에 독립적입니다. os 의존적 인 물건을 사용하는 것은 나쁜 습관이며, 처음에 나를 위해 쓴 이후로 게으르고있었습니다.
피터는 5

또한 Python 3.x 버전 용으로 작성되었습니다. 만약 당신이 2.x 친화적 인 것을 원한다면, 단지 "something"을 출력하도록 모든 print ( "something")를 바꾸십시오
Peter pete
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.