JPG dosyaları nasıl silinir, ancak yalnızca eşleşen RAW dosyası varsa?


18

Erken (Canon G2) fotoğraflarımın tamamı JPG, ancak Nikon D90'ımı aldığımda başlangıçta JPG'de çekim yaptım, sonra RAW + JPG'ye geçtim ve şimdi sadece RAW'a geçmek istiyorum.

HDD'imde binlerce fotoğraf var. Fotoğraflar, alt dizinlerde (tarihe göre) İçe Aktar adlı tek bir dizin altında bulunur.

Tüm bu fotoğrafları Lightroom 3.0'a aktarmak üzereyim, ancak tüm JPG dosyalarını silmek istiyorum, ancak sadece karşılık gelen bir RAW dosyasının olduğu yerde (yani artık aynı JPG ve RAW sürümlerini tutmak istemiyorum) dosya).

Bunu Lightroom içinde (yinelenen JPG dosyaları dahil her şeyi içe aktardıktan sonra) kolayca yapabilirsem harika olurdu. Dosyaları içe aktarmadan önce bunu yapmanın kolay bir yolu olsaydı da iyi olurdu (ancak umarım bu, JPG ve NEF uzantılarına sahip dosya adları arayan her dizini ziyaret etmeyi gerektirmez).

Bunu yapmanın bir yolunu bilen var mı (Lightroom'da veya Windows'ta bir araç / komut dosyasıyla)?


Tüm jpg dosyalarınız ve RAW dosyalarınız en az aynı dizeye sahip mi (diğer karakterler de bunlara eklenebilir)? Örneğin, IMG_1234_portrait_picture.jpg & IMG_1234.CR2.
dpollitt

Tüm JPG / NEF çiftlerimin tamamen aynı dosya adına sahip olduğunu düşünüyorum (uzantı hariç).
seanmc

3
Bunu dakikalar içinde bir cevap almanız gereken Stack Overflow'a taşımak için oy vereceğim =)
anon

1
@anon: Bu StackOverflow'a tam olarak nasıl ait? Bu, kesinlikle görüntü yönetimi ve fotoğraf düzenleme araçlarıyla ilgili olduğu için konu üzerine bir soru. Komut dosyasına teğet referansın dışında ... bunun programlama ile ilgisi yoktur.
jrista

2
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum çünkü bu aslında fotoğrafla ilgili değil, sadece fotoğraf olan dosyaları yönetmekle ilgili. Söz konusu iki dosya türü, .doc ve .pdf dosyaları vb. Gibi bir formdan diğerine çevrilebilecek başka dosya türleri olsaydı, soru ve yanıt aynı olurdu.
xiota

Yanıtlar:


24

On Windows'un , klasöre gidin ve hızlı bir komut bu çalıştırın:

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

Temel olarak, geçerli klasörden geçer, NEF dosyaları üzerinden çalışır ve varsa JPG'yi siler. JPG orada değilse hataları yok sayar.

Alt klasörler istiyorsanız /s, dirkomuta ekleyin .


3
Mükemmel teşekkürler! Tabii ki ilk çalıştırmadan önce, "del" i "echo" olarak değiştirdim. Sonra ne yaptığını anlamak için "yardım" koştum. Komut istemi komut dosyalarına baktığımdan beri uzun zaman geçti, çünkü "for" komutunun çok fazla seçeneği olduğu hakkında hiçbir fikrim yoktu.
seanmc

Sorun değil! Test ederken, "echo" =) da kullandım. Daha fazla çıktı görmek için "2> nul" u kaldırın. Kendi NEF / JPG dosyalarım için böyle bir şey yapmayı kastediyordum ve bu mükemmel bir fırsattı.
anon

7

Tomy'nin Python betiğinin değiştirilmiş bir sürümü . farklılıklar:

  • birden fazla ham uzantıya izin verilir
  • jpg dosyasını yalnızca çiftler aynı klasördeyse kaldırın (başka bir klasördeki ham dosya gibi adlandırılmış bir jpg dosyasının yanlışlıkla kaldırılmasını önleyin)
  • büyük / küçük harfe duyarlı değil

#!/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)

harika bir senaryo. Bunu kullanacağım çünkü birçok iyi yük devretme var. Ancak bu satırı #!/usr/bin/env pythonbaşa eklemelisiniz . Aksi takdirde garip ImageMagick hataları vardı (benim mac ImageMagick ile açık .py dosyaları görünüyor)
therealmarv

Sadece FYI: dosyalar gerçekten adlandırıldığında da çalışmıyor gibi görünüyor .jPg. Ayrıca, dosyalar harici disk ve atık dizininde, örneğin /homedir.
therealmarv


@therealmarv: aslında ImageMagick ile olan şey, betiğin ImageMagick değil kabukta açılmasıdır, ancak "import" bir ImageMagick aracının adıdır.
Maksimum

6

Karşılık gelen bir dosya olmadığında dosyaları hareket ettiren bir Python betiği . Faydalı Mac OS X !JPGRAW

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)

5
  • Boş bir Kütüphane oluşturma
  • Lightroom ana menüsünden Düzen> Tercihler'i (Windows) veya Lightroom> Tercihler'i (Mac OS) seçin.
  • Genel tercihlerde "Ham Dosyaları Yanındaki JPEG Dosyalarına Ayrı Fotoğraf Olarak Uygula" seçimini kaldırın
    • Bu varsayılan değer olmalıdır.
  • Tüm dosyalarınızı içe aktarın (arama alt klasörlerini seçebilirsiniz), yeni bir konuma taşınmasını söyler
  • RAW dosyaları olan JPG dosyaları, kaldırmanız için orijinal konumunda bırakılacaktır

Anladığım kadarıyla, ışık odasındaki küçük resim RAW + JPG diyebilir, ancak JPG aslında hiçbir şekilde depolanmaz veya erişilebilir değildir.

Herhangi bir programlama diliyle oldukça basit bir toplu komut dosyası da yazabilirsiniz.


2

OS X için bash betiğini seviyorum ( T.Toivonen tarafından ), ancak birkaç sorun olduğunu fark ettim.

  • Boşluk içeren dizin isimlerimi beğenmedi. Bu, find komutunun biraz farklı bir şekilde işlenmesini gerektiriyordu.

  • Orijinal komut dosyası yalnızca küçük harf uzantıları için çalışır. Biraz da büyük harfli uzantıları hesaba katmak için komut dosyasının bu bölümünü geliştirdik. Yalnızca kabul ettiğini DNG+JPGveya dng+jpgeşlediğini ve DNG+jpgveya gibi kombinasyonları yoksayacağını unutmayın DnG+JpG.

  • Orijinal çözüm sadece bir tane önerdi wastedir konum , ancak düzeltmem her dizin dalında seyahat ederken bir alt dizinin oluşturulmasına izin veriyor. Döngüden önce dizinin adını tanımlarsınız.

  • Neler olduğunu görmek isterim, özellikle mvveya rmkomutlar kullanıldığında;)

Ben ayarlamasını, senaryonun sadece son kısmını gösteriyorum uzay uğruna basedir, wastedirve döngü.

[...]

#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

Soru "windows" olarak etiketlendi, böylece bunun tipik bir Windows sisteminde çalışmak için nasıl yapılabileceğini söyleyebilirsiniz. Örneğin Cygwin'i çalıştırıyorum (ve masaüstündeyken bu cevaba daha iyi bakmayı, davranışı biraz değiştirmeyi planlıyorum)
Chris H

2

İşte için bir çözüm bash(Linux veya Mac OS X). Windows'ta, bir kopyasını almak için Cygwin'i yükleyebilirsiniz 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

2

İşte (Linux) bashkullanan başka bir sürüm find. Olduğu gibi , Ben Pingilley cevabı , yükleyin Cygwin Windows üzerinde bash alır.

#!/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

1

İşte bu konuda benim almak. Burada bahsedilen önceki senaryolardan birçok iyi fikir geldi.

Bu OS X için bir bash betiğidir . Aynı temel dosya adı ve dng+jpguzantılarına sahip dosyaları arar . A jpgile tam olarak aynı ada sahip bulunursa dng, o dosya adı görüntülenir ( -e), dosya taşınır ( -m) veya silinir ( -d).

Alt klasörlerden geçecek, böylece kataloğunuzun tamamı veya sadece bir kısmı için kullanabilirsiniz.

Diğer ham dosya uzantıları *.dngiçin komut dosyasında tercih ettiğiniz uzantıyı kullanın.

Uyarı: Aynı ada ancak farklı uzantıya sahip iki farklı resminiz olabilir. Bunlar bu senaryonun kaçınılmaz kayıpları.

Komut dosyasını nasıl kullanacağınız aşağıda açıklanmıştır:

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 

Temel kullanım şu şekilde çalışır:

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

Bu, jpgher ikisine sahip olma ölçütlerine uyan dosyaların tüm dosya adlarını dngvejpg aynı ada dosya .

Sonuç böyle bir şeye benzeyecektir:

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.

Şimdi ben sadece geçiş olacağını dosyaları silmek istiyorsanız -eiçin -d:

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

Ya da dosyaları / duplicates'e taşımak istersem yürütürüm -m.

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

Şimdi yinelenen jpgdosyalar/Volumes/photo/DNG/2015/duplicates

İşte senaryo: 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."

1

İşte Mac OS Xbash için bir komut dosyası . Bu olabilir bazı değişikliklerle Linux üzerinde çalışır.

#!/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

rmtrashdosyaları doğrudan silmek yerine Çöp Kutusu'na taşıyan bir yardımcı programdır. MacPorts'tan alabilirsiniz:

sudo port install rmtrash

Bundan kaçınmak istiyorsanız , dosyaları hemen silen rmtrashkomut dosyasında değiştirin .rmJPG


1

Aşağıdaki Python betiğini yazdım . Ttaveira'nın senaryosuyla karşılaştırıldığında , fazladan iş yapar.

  • Alt dizinlere bakar.
  • Hedef atık dizini oluşturur.
  • Taşıma hatalarını önlemek için atık dizininde zaten mevcut olan dosyaları kaldırır.

# 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)

2
Merhaba ve Photo.SE'ye hoş geldiniz. Cevabınız ttaveira'nın cevabından nasıl farklı ?
Saaru Lindestøkke

Komut dosyası fazladan iş yapar: ayrıca tüm alt dizinlere bakar, yoksa jpg'ler için hedef atık dizini oluşturur ve zaten atık dizininde varsa taşımak yerine bir jpg kaldırır (hareket hatalarını önler)
Tomy

0

Mac OS X üzerinde çalışırken , önceki yanıtlarda "aynı içerik" için bir sağlık kontrolü yapmıyordum. Fotoğraf makinemde resim sayacını etkinleştirmeyi unuttuğum için farklı resimler için yinelenen adlar vardı. İşte aynı yakalama süresi için EXIF ​​bilgilerini kontrol eden sürümüm:

Koşman gerek

sudo port install rmtrash exiv2

önce aşağıdaki komutu kullanabilirsiniz. Bu karşılaştırma yazılmıştır JPGile NEFbenim Nikon D90 dosyaları. Dosya uzantılarını ihtiyaçlarınıza göre ayarlayın.

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

akıl sağlığı kontrolü olmasaydı, her şey çok kısa bir astar olurdu:

find . -name \*.NEF |sed s/\.NEF/.JPG/g | xargs find 2>/dev/null | xargs rmtrash
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.