Bagaimana cara menghapus file JPG, tetapi hanya jika file RAW yang cocok ada?

18

Foto awal saya (Canon G2) semuanya JPG, tetapi ketika saya mendapatkan Nikon D90 saya awalnya mengambil dalam JPG, kemudian beralih ke RAW + JPG, dan sekarang saya ingin beralih ke RAW saja.

Saya memiliki ribuan foto di HDD saya. Foto-foto tersebut berada di dalam sub-direktori (berdasarkan tanggal) di bawah satu direktori bernama Impor.

Saya akan mengimpor semua foto ini ke dalam Lightroom 3.0, namun, saya ingin menghapus semua file JPG, tetapi hanya jika sudah ada file RAW yang sesuai (mis. Saya tidak lagi ingin menyimpan versi JPG dan RAW yang sama. mengajukan).

Jika saya bisa melakukan ini dengan mudah di dalam Lightroom (setelah mengimpor semuanya, termasuk file JPG duplikat) itu akan bagus. Ini juga akan baik-baik saja jika ada cara mudah untuk melakukan ini sebelum mengimpor file (tapi mudah-mudahan ini tidak melibatkan harus mengunjungi setiap direktori mencari nama file dengan ekstensi JPG dan NEF).

Adakah yang tahu cara untuk melakukan ini (di Lightroom, atau dengan beberapa alat / skrip di Windows)?

seanmc
sumber
Apakah semua file jpg dan file RAW Anda memiliki minimal string yang sama (karakter lain dapat ditambahkan ke keduanya)? Misalnya IMG_1234_portrait_picture.jpg & IMG_1234.CR2.
dpollitt
Saya pikir semua pasangan JPG / NEF saya memiliki nama file yang persis sama (kecuali untuk ekstensi).
seanmc
3
Aku akan memilih untuk pindah ini untuk Stack Overflow, di mana Anda harus mendapatkan jawaban dalam beberapa menit =)
anon
1
@anon: Bagaimana tepatnya ini milik StackOverflow? Ini jelas merupakan pertanyaan pada topik di sini, karena berkaitan dengan manajemen gambar dan alat editing foto. Di luar referensi tangensial ke skrip ... ini tidak ada hubungannya dengan pemrograman.
jrista
2
Saya memilih untuk menutup pertanyaan ini sebagai di luar topik karena ini bukan tentang fotografi, ini tentang mengelola file yang kebetulan berupa foto. Pertanyaan dan jawabannya akan sama jika dua jenis file yang dimaksud adalah jenis file lain yang dapat diterjemahkan dari satu bentuk ke bentuk lain, seperti file .doc dan .pdf, dll.
xiota

Jawaban:

24

Di Windows , buka folder, dan jalankan ini di command prompt:

for /f "delims==" %r in ('dir /b *.nef') do del "%~dpr%~nr.jpg" 2> nul

Pada dasarnya, ini berjalan melalui folder saat ini, berjalan melalui file NEF, dan menghapus JPG jika ada. Itu mengabaikan kesalahan jika JPG tidak ada.

Jika Anda ingin subfolder, sertakan /sdalam dirperintah.

segera
sumber
3
Sempurna terima kasih! Tentu saja sebelum saya menjalankannya pertama kali, saya mengubah "del" menjadi "echo". Lalu aku berlari "membantu" untuk memahami apa yang dilakukannya. Sudah lama sekali saya tidak melihat scripting command prompt, karena saya tidak tahu bahwa perintah "for" memiliki begitu banyak pilihan.
seanmc
Tidak masalah! Saat saya menguji, saya juga menggunakan "echo" =) Untuk melihat lebih banyak keluaran, hapus "2> nul." Saya bermaksud melakukan sesuatu seperti ini untuk file NEF / JPG saya sendiri, dan ini adalah kesempatan yang sempurna.
anon
7

Ini adalah versi modifikasi dari skrip Python Tomy . Perbedaan:

  • beberapa ekstensi mentah diizinkan
  • hapus jpg hanya jika pasangan berada di folder yang sama (hindari penghapusan jpg tanpa sengaja yang dinamai seperti file mentah di folder lain)
  • case sensitif

#!/usr/bin/env python
# Script:      remove_jpg_if_raw_exists.py
#
# Description: This script looks in all sub directories for
#              pairs of JPG and RAW files.
#              For each pair found the JPG is moved to a
#              waste basket directory.
#              Otherwise JPG is kept.
#
# Author:      Thomas Dahlmann
# Modified by: Renaud Boitouzet

import os
import shutil

# define your file extensions here, case is ignored.
# Please start with a dot.
# multiple raw extensions allowed, single jpg extension only
raw_extensions = (".Dng", ".cR2", ".nef", ".crw")
jpg_extension = ".jPg"

# define waste basket directory here. Include trainling slash or backslash.
# Windows : waste_dir = "C:\path\to\waste\"
waste_dir = "/Users/marvin/Pictures/waste/"

##### do not modify below ##########

# find files
def locate(folder, extensions):
    '''Locate files in directory with given extensions'''
    for filename in os.listdir(folder):
        if filename.endswith(extensions):
            yield os.path.join(folder, filename)

# make waste basket dir
if not os.path.exists(waste_dir):
    os.makedirs(waste_dir)

# Make search case insensitive
raw_ext = tuple(map(str.lower,raw_extensions)) + tuple(map(str.upper,raw_extensions))
jpg_ext = (jpg_extension.lower(), jpg_extension.upper())

root=os.curdir
#find subdirectories
for path, dirs, files in os.walk(os.path.abspath(root)):
    print path
    raw_hash = {}
    for raw in locate(path, raw_ext):
        base_name = os.path.basename(raw)
        base_name = os.path.splitext(base_name)[0]
        raw_hash[base_name] = True

    # find pairs and move jpgs of pairs to waste basket
    for jpg in locate(path, jpg_ext):
        base_name = os.path.basename(jpg)
        base_name = os.path.splitext(base_name)[0]
        if base_name in raw_hash:
            jpg_base_name_with_ext = base_name + jpg_extension
            new_jpg = waste_dir + jpg_base_name_with_ext
            print "%s: %s = %s => %s" % (path, base_name, jpg, waste_dir)
            if os.path.exists(new_jpg):
                os.remove(jpg)
            else:
                shutil.move(jpg, new_jpg)
Renaud B.
sumber
naskah yang bagus. Saya akan menggunakannya karena memiliki banyak failover yang bagus. Namun Anda harus menambahkan baris ini #!/usr/bin/env pythonke awal. Kalau tidak, saya punya kesalahan ImageMagick aneh (tampaknya mac saya membuka file .py dengan ImageMagick)
therealmarv
Hanya FYI: sepertinya juga tidak berfungsi ketika file benar-benar dinamai .jPg. Ini juga tidak berfungsi ketika file pada disk eksternal dan direktori limbah misalnya dalam /homedir.
therealmarv
beberapa koreksi: gist.github.com/therealmarv/ec603bd4a91d51092a18
therealmarv
@therealmarv: sebenarnya apa yang terjadi dengan ImageMagick adalah skrip sedang dibuka di shell, bukan ImageMagick, tetapi "impor" adalah nama alat ImageMagick.
Maks
6

Berikut ini adalah skrip Python yang memindahkan JPGfile ketika tidak RAWada file yang sesuai . Berguna di Mac OS X !

import os
import shutil

raw_ext = '.CR2'
jpg_ext = '.JPG'
destination = '/Users/JohnSmith/Desktop/jpgs/'

for filename in os.listdir('.'):
    (shortname, extension) = os.path.splitext(filename)

    if extension == raw_ext:
        if os.path.isfile(shortname + jpg_ext):
            print 'Moving ' + shortname + jpg_ext + '...'
            shutil.move(shortname + jpg_ext, destination)
ttaveira
sumber
5
  • Buat Perpustakaan kosong
  • Dari menu utama Lightroom, pilih Edit> Preferences (Windows) atau Lightroom> Preferences (Mac OS).
  • Dalam preferensi umum batalkan pilihan "Perlakukan File JPEG Di sebelah File Mentah Sebagai Foto Terpisah"
    • Ini harus menjadi default.
  • Impor semua file Anda (Anda dapat memilih subfolder pencarian), memerintahkannya untuk pindah ke lokasi baru
  • File JPG yang memiliki file RAW akan ditinggalkan di lokasi asli untuk Anda hapus

Seperti yang saya pahami, thumbnail di lightroom mungkin mengatakan RAW + JPG, tetapi JPG sebenarnya tidak disimpan atau diakses dengan cara apa pun.

Anda juga dapat menulis skrip batch yang cukup sederhana dengan bahasa pemrograman apa pun.

Eruditas
sumber
2

Saya suka skrip bash untuk OS X (oleh T.Toivonen ), tetapi saya perhatikan ada beberapa masalah.

  • Itu tidak suka nama direktori saya, yang berisi spasi. Untuk itu diperlukan penanganan perintah find yang agak berbeda.

  • Script asli hanya berfungsi untuk ekstensi huruf kecil. Saya telah sedikit memperbaiki bagian skrip tersebut untuk memperhitungkan ekstensi yang ada dalam huruf besar juga. Perhatikan, bahwa itu hanya menerima DNG+JPGatau dng+jpgberpasangan, dan itu akan mengabaikan kombinasi seperti DNG+jpgatau DnG+JpG.

  • Solusi asli hanya mengusulkan satu wastedirlokasi, sedangkan perbaikan saya memungkinkan subdirektori dibuat pada setiap cabang direktori saat perjalanan. Anda menentukan nama direktori sebelum loop.

  • Saya suka melihat apa yang terjadi, terutama ketika mvatau rmperintah digunakan;)

Demi ruang, saya hanya menunjukkan bagian terakhir dari skrip, dari pengaturan a basedir, wastedirdan loop.

[...]

#Now set it as a basedir
BASEDIR=$arg
WASTEDIR=duplicates
find "$BASEDIR" -iname '*.dng' -print0 | while read -d $'\0' filename 
    do
    filepath="${filename%/*}"
    basename="${filename##*/}"
    prefix="${basename%%.*}"
    suffix=${filename##*.}
    if [[ "$suffix" =~ [A-Z] ]]; then rsuffix="JPG"; else rsuffix="jpg"; fi 
    if [ -e "$filepath/$prefix.$rsuffix" ]; then
        let counter="$counter+1"
        if (( $isSetE==1 )); then
            echo "FOUND: $filepath/$prefix.$rsuffix"
        fi
        if (( $isSetM==1 )); then
            echo "Moving $filepath/$prefix.$rsuffix to $filepath/$WASTEDIR"
            if [ ! -d "$filepath/$WASTEDIR" ]; then mkdir "$filepath/$WASTEDIR"; fi
            mv "$filepath/$prefix.$rsuffix" "$filepath/$WASTEDIR"
        fi
        if (( $isSetD==1 )); then
            echo "Removing duplicate $filepath/$prefix.$rsuffix"
            rm "$filepath/$prefix.$rsuffix"
        fi
    fi
done
Filip Wolak
sumber
Pertanyaan itu ditandai "windows" sehingga Anda bisa melakukannya dengan mengatakan bagaimana ini bisa dibuat untuk bekerja dalam sistem Windows yang khas. Saya menjalankan Cygwin, misalnya (dan saya berencana untuk melihat jawaban ini dengan lebih baik ketika saya menggunakan desktop, untuk sedikit mengubah perilaku)
Chris H
2

Ini adalah solusi untuk bash(Linux atau Mac OS X). Di Windows, Anda dapat menginstal Cygwin untuk mendapatkan salinannya bash.

keep=$(ls | grep -v ps | grep -A1 JPG | grep NEF)
for i in $keep ; do
   mv $i $i.keep
done

ls | egrep -v '(JPG|keep)' | xargs rm -f

change=$(ls | grep keep | sed 's/.keep//g')
for i in $change ; do
   mv $i.keep $i
done
Ben Pingilley
sumber
2

Ini adalah bashversi lain menggunakan find(Linux). Seperti jawaban Ben Pingilley , Anda dapat menginstal Cygwin untuk mendapatkan bash di Windows.

#!/bin/bash
read -p "please enter file suffix for raw format (e.g ORF, NEF, CR2): " suffix

find . -type f -iname "*.${suffix}" | \
while read line
do
  lowercase=$(echo "$line" | sed "s/${suffix}/jpg/gi")
  uppercase=$(echo "$line" | sed "s/${suffix}/JPG/gi")

  if [ -f "${lowercase}" ]
  then
    rm -v "${lowercase}"
  elif [ -f "${uppercase}" ]
  then
    rm -v "${uppercase}"
  else
    echo "${line}: no jpg present"
  fi
done
bsod
sumber
1

Inilah pendapat saya tentang masalah ini. Banyak ide bagus datang dari skrip sebelumnya yang disebutkan di sini.

Ini adalah bash script untuk OS X . Itu mencari file yang ada dengan nama file dan dng+jpgekstensi yang sama. Jika a jpgditemukan dengan nama yang persis sama dengan dng, maka nama file itu ditampilkan ( -e), file dipindahkan ( -m) atau dihapus ( -d).

Ini akan melalui subfolder, sehingga Anda bisa menggunakannya untuk seluruh katalog Anda atau hanya sebagian saja.

Untuk ekstensi file mentah lainnya, cukup gantikan *.dngdengan script dengan ekstensi pilihan Anda.

Peringatan: Anda dapat memiliki dua gambar berbeda dengan nama yang sama, tetapi ekstensi berbeda. Itu adalah korban yang tak terhindarkan dari naskah ini.

Berikut cara menggunakan skrip:

Usage: dng-jpg.sh [-m <path>] [-d <path>] [-e <path>] [-h]

-m: for move   (moves files to <path>/duplicates)
-d: for delete (deletes duplicate files)
-e: for echo   (lists duplicate files)
-h: for help 

Penggunaan dasar akan bekerja seperti ini:

$ ./dng-jpg.sh -e /Volumes/photo/DNG/2015

Itu akan menggemakan semua nama jpgfile file yang cocok dengan kriteria memiliki keduanya dngdan jpgfile dengan nama yang sama.

Hasilnya akan terlihat seperti ini:

Echo selected with path: /Volumes/photo/DNG/2015
/Volumes/photo/DNG/2015/03/18/2015-03-18_02-11-17.jpg
/Volumes/photo/DNG/2015/06/01/2015-06-01_05-10-50.jpg
/Volumes/photo/DNG/2015/06/01/2015-06-01_05-10-56.jpg
/Volumes/photo/DNG/2015/06/01/2015-06-01_05-11-39.jpg
/Volumes/photo/DNG/2015/06/01/2015-06-01_05-11-54.jpg
/Volumes/photo/DNG/2015/06/01/2015-06-01_05-12-26.jpg
/Volumes/photo/DNG/2015/06/01/2015-06-01_05-12-43.jpg
/Volumes/photo/DNG/2015/06/01/2015-06-01_05-13-21.jpg
/Volumes/photo/DNG/2015/06/01/2015-06-01_05-13-56.jpg
9 files found.

Sekarang jika saya ingin menghapus file saya hanya akan beralih -eke -d:

$ ./dng-jpg.sh -d /Volumes/photo/DNG/2015

Atau jika saya ingin memindahkan file ke / duplikat saya akan mengeksekusinya -m.

$ ./dng-jpg.sh -m /Volumes/photo/DNG/2015

Sekarang jpgfile duplikat akan masuk/Volumes/photo/DNG/2015/duplicates

Berikut skripnya: dng-jpg.sh

#!/bin/bash

# Init variables
isSetM=0
isSetD=0
isSetE=0
isSetCount=0
counter=0

#Display usage info
usage() {

    cat <<EOF

Usage: dng-jpg.sh [-m <path>] [-d <path>] [-e <path>] [-h]

-m: for move   (moves files to <path>/duplicates)
-d: for delete (deletes duplicate files)
-e: for echo   (lists duplicate files)
-h: for help 

EOF
  exit 1
}

#Check for parameters
while getopts ":m:d:e:h" opt; do
  case ${opt} in
    m)
        isSetM=1
        let isSetCount="$isSetCount+1"
        arg=${OPTARG}
      echo "Move selected with path:" $arg
      ;;
    d)
        isSetD=1
        let isSetCount="$isSetCount+1"
        arg=${OPTARG}
      echo "Delete selected with path:" $arg
      ;;
    e)
        isSetE=1
        let isSetCount="$isSetCount+1"
        arg=${OPTARG}
      echo "Echo selected with path:" $arg
      ;;
    h)
        let isSetCount="$isSetCount+1"
        usage
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      usage
      ;;
    :)
      echo "Option -$OPTARG requires a directory argument." >&2
      usage
      ;;
    *)
      usage
      ;;
  esac
done

# If no parameters, show usage help and exit
if test -z "$1"; then
    usage
fi

# If multiple parameters (not counting -a), show usage help and exit
if (($isSetCount > 1)); then
    usage
fi

#Verify directory
if [ ! -d "$arg" ]; then
  echo "$arg is not a path to a directory." >&2
  usage
fi

#Now set it as a basedir
BASEDIR=$arg
WASTEDIR="$BASEDIR/duplicates/"
if (( $isSetM==1 )); then
    mkdir $WASTEDIR
fi

for filename in $(find $BASEDIR -name '*.dng' -exec echo {} \; | sort); do
   prefix=${filename%.dng}
    if [ -e "$prefix.jpg" ]; then
        let counter="$counter+1"
        if (( $isSetE==1 )); then
            echo "$prefix.jpg"
        fi
        if (( $isSetM==1 )); then
            mv $prefix.jpg $WASTEDIR
        fi
        if (( $isSetD==1 )); then
            rm $prefix.jpg
        fi
    fi
done

echo "$counter files found."
T. Toivonen
sumber
1

Berikut adalah bashnaskah untuk Mac OS X . Ini dapat bekerja di Linux dengan beberapa perubahan.

#!/bin/bash
read -p "Delete JPEGs when DNG exists? Ctrl-C to cancel. [Enter] to continue: "

for FILE in *.dng; do
  JPG_FILE=$(echo "$FILE" | sed "s/dng/jpg/g")
  rmtrash "${JPG_FILE}" 1>/dev/null
done

rmtrashadalah utilitas yang memindahkan file ke Sampah, alih-alih menghapusnya secara langsung. Anda bisa mendapatkannya dari MacPorts dengan demikian:

sudo port install rmtrash

Jika Anda ingin menghindari itu, cukup ganti rmtrashdengan skrip rm, yang akan segera menghapus JPGfile.

Manas Tungare
sumber
1

Saya menulis skrip Python berikut . Dibandingkan dengan skrip ttaveira , ini memang bekerja ekstra.

  • Lihat di sub-direktori.
  • Membuat direktori limbah tujuan.
  • Menghapus file yang sudah ada di direktori limbah untuk menghindari kesalahan pindahkan.

# Script:      remove_jpg_if_raw_exists.py
#
# Description: This script looks in all sub directories for
#              pairs of JPG and RAW files.
#              For each pair found the JPG is moved to a
#              waste basket directory.
#              Otherwise JPG is kept.
#
# Author:      Thomas Dahlmann

import os, fnmatch

# define your file extensions here, case is ignored
raw_extension = "nef"
jpg_extension = "jpg"

# define waste basket directory here
waste_dir = "c:\image_waste_basked"

##### do not modify below ##########

# recursive find files 
def locate(pattern, root=os.curdir):
    '''Locate all files matching supplied filename pattern 
    in and below root directory.'''
    for path, dirs, files in os.walk(os.path.abspath(root)):
        for filename in fnmatch.filter(files, pattern):
            yield os.path.join(path, filename) 

# get base names from raw's
raw_hash = {}
for raw in locate("*." + raw_extension):
    base_name = os.path.basename(raw)
    base_name = os.path.splitext(base_name)[0]
    raw_hash[base_name] = True

# make waste basket dir
if not os.path.exists(waste_dir):
    os.makedirs(waste_dir)

# find pairs and move jpgs of pairs to waste basket    
for jpg in locate("*." + jpg_extension):
    base_name = os.path.basename(jpg)
    base_name = os.path.splitext(base_name)[0]
    if base_name in raw_hash:
        jpg_base_name_with_ext = base_name + "." + jpg_extension
        new_jpg = waste_dir + "\\" + jpg_base_name_with_ext
        print "%s => %s" % (jpg, waste_dir)
        if os.path.exists(new_jpg):
            os.remove(jpg)
        else:
            os.rename(jpg, new_jpg)
Tomy
sumber
2
Hai dan selamat datang di Photo.SE. Bagaimana jawaban Anda berbeda dari jawaban ttaveira ?
Saaru Lindestøkke
Script melakukan beberapa pekerjaan tambahan: juga terlihat di semua sub-direktori, membuat direktori limbah tujuan untuk jpg jika tidak ada dan menghapus jpg alih-alih bergerak jika sudah ada di direktori limbah (menghindari kesalahan bergerak)
Tomy
0

Bekerja pada Mac OS X , saya kehilangan cek kewarasan untuk "konten yang sama" di jawaban sebelumnya. Saya memiliki nama rangkap untuk gambar yang berbeda karena saya lupa mengaktifkan penghitung gambar di kamera saya. Inilah versi saya, yang memeriksa informasi EXIF ​​untuk waktu pengambilan yang sama:

Anda harus berlari

sudo port install rmtrash exiv2

sebelum Anda dapat menggunakan perintah berikut. Itu ditulis untuk membandingkan JPGdengan NEFfile dari Nikon D90 saya. Sesuaikan ekstensi file sesuai dengan kebutuhan Anda.

find . -name \*.NEF |sed s/\.NEF/.JPG/g | xargs find 2>/dev/null | \
xargs perl -e 'foreach(@ARGV) {my $jpg=$_;my $nef=s/\.JPG/.NEF/r; my $tjpg = `exiv2 -g Exif.Photo.DateTimeOriginal -pt $jpg`; my $nef=s/\.JPG/.NEF/r; my $tnef = `exiv2 -g Exif.Photo.DateTimeOriginal -pt $nef`; if($tjpg eq $tnef) {print "$jpg\n"}}' | \
xargs rmtrash

tanpa pemeriksaan kewarasan, semuanya akan menjadi sangat singkat:

find . -name \*.NEF |sed s/\.NEF/.JPG/g | xargs find 2>/dev/null | xargs rmtrash
André Pareis
sumber