JPGファイルを削除する方法、ただし一致するRAWファイルが存在する場合のみ?


18

私の初期の(Canon G2)写真はすべてJPGですが、Nikon D90を手に入れたとき、最初にJPGで撮影してからRAW + JPGに切り替えましたが、今はRAWのみに切り替えたいと思います。

HDDには文字通り何千枚もの写真があります。写真は、インポートと呼ばれる単一のディレクトリの下のサブディレクトリ(日付別)にあります。

これらすべての写真をLightroom 3.0にインポートしようとしていますが、すべてのJPGファイルを削除したいのですが、対応するRAWファイルが既に存在する場合のみです(つまり、同じバージョンのJPGバージョンとRAWバージョンを保持したくない場合)ファイル)。

Lightroom内で簡単にこれを行うことができれば(重複したJPGファイルを含むすべてをインポートした後)素晴らしいでしょう。ファイルをインポートする前にこれを行う簡単な方法があれば大丈夫です(ただし、これはJPGとNEFの両方の拡張子を持つファイル名を探すためにすべてのディレクトリにアクセスする必要がないことを願っています)。

誰かがこれを行う方法を知っていますか(Lightroomで、またはWindowsのツール/スクリプトを使用して)?


すべてのjpgファイルとRAWファイルには、少なくとも同じ文字列が含まれていますか(他の文字をどちらかに追加できますか)?例:IMG_1234_portrait_picture.jpg&IMG_1234.CR2。
-dpollitt

私のすべてのJPG / NEFペアはまったく同じファイル名であると思います(拡張子を除く)。
seanmc

3
私はあなたが数分以内に答えを得る必要があるスタックオーバーフロー、=)にこれを移動するために投票する
アノン

1
@anon:これはStackOverflowにどのように属しますか?画像管理と写真編集ツールを扱っているので、これは間違いなくここで話題の質問です。スクリプトへの接線参照以外では、これはプログラミングとは関係ありません。
jrista

2
これは写真に関するものではなく、たまたま写真であるファイルを管理するためのものであるため、この質問をトピック外として終了することに投票しています。問題のファイルには2つのタイプが、このような.DOCや.PDFファイルなどのように別のフォームから翻訳することができ、ファイルの任意の他のタイプであった場合の質問と回答は同じだろう
xiotaは

回答:


24

のWindowsフォルダに移動し、プロンプトのコマンドでこれを実行します。

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

基本的に、現在のフォルダーを通過し、NEFファイルを実行し、JPGが存在する場合は削除します。JPGが存在しない場合、エラーは無視されます。

サブフォルダーが必要な場合/sは、dirコマンドに含めます。


3
パーフェクト、ありがとう!もちろん、最初に実行する前に、「del」を「echo」に変更しました。それから、私はそれが何をしていたかを理解するために「助けて」走りました。「for」コマンドに多くのオプションがあることを知らなかったので、コマンドプロンプトスクリプトを見てから明らかに長い時間が経っています。
seanmc

問題ない!テスト中に、「echo」も使用しました=)さらに出力を表示するには、「2> nul」を削除します。私は自分のNEF / JPGファイルに対してこのようなことをするつもりでしたが、これは絶好の機会でした。
アノン

7

これが、TomyのPythonスクリプトの修正バージョンです。違い:

  • 複数の生の拡張子が許可されます
  • ペアが同じフォルダーにある場合にのみjpgを削除します(他のフォルダーにある生ファイルのような名前のjpgを誤って削除しないようにします)
  • 大文字小文字を区別しません

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

素晴らしいスクリプト。多くの適切なフェイルオーバーがあるため、これを使用します。ただし、この行#!/usr/bin/env pythonを先頭に追加する必要があります。そうしないと、奇妙なImageMagickエラーが発生しました(ImageMagickでMacが.pyファイルを開くようです)
-therealmarv

ちなみに、ファイルに実際に名前が付けられていると機能しないよう.jPgです。また、ファイルが外部ディスクにあり、ディレクトリ内などのディレクトリを無駄にしている場合にも機能しません/home
therealmarv


@therealmarv:実際にImageMagickで起こっていることは、スクリプトがImageMagickではなくシェルで開かれていることですが、「import」はImageMagickツールの名前です。
最大

6

対応するファイルが存在しない場合にファイルを移動するPythonスクリプトを次にJPG示しRAWます。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)

5
  • 空のライブラリを作成する
  • Lightroomのメインメニューから、編集/環境設定(Windows)またはLightroom /環境設定(Mac OS)を選択します。
  • 「一般」環境設定で「JPEGファイルをRAWファイルの隣に別の写真として扱う」の選択を解除します
    • これがデフォルトです。
  • すべてのファイルをインポートし(検索サブフォルダーを選択できます)、新しい場所に移動するように指示します
  • RAWファイルを含むJPGファイルは、削除するために元の場所に残ります

私が理解しているように、lightroomのサムネイルにはRAW + JPGと表示される場合がありますが、JPGは実際には保存もアクセスもされていません。

任意のプログラミング言語を使用して、非常に単純なバッチスクリプトを作成することもできます。


2

以下のようなI OS Xのためのbashスクリプト(によってT.Toivonen)が、私はいくつかの問題がある気づきました。

  • スペースを含む私のディレクトリ名は好きではありませんでした。それには、findコマンドの少し異なる処理が必要でした。

  • 元のスクリプトは、小文字の拡張子に対してのみ機能します。スクリプトのその部分をわずかに改善して、大文字の拡張機能も考慮しました。受け入れるDNG+JPGdng+jpgペアになるか、DNG+jpgまたはなどの組み合わせを無視することに注意してくださいDnG+JpG

  • 元のソリューションでは1つのwastedir場所しか提案していませんでしたが、私の修正により、各ディレクトリブランチにサブディレクトリを作成できます。ループの前にディレクトリの名前を定義します。

  • 私は何が起こっているのか、特にmvor rmコマンドが使われているときを見てみたい;)

私は設定から、スクリプトの最後の部分だけを示していた空間のためにbasedirwastedirそしてループ。

[...]

#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

質問には「windows」というタグが付けられていたため、典型的なWindowsシステムでこれをどのように機能させることができるかを言うことができます。たとえば、Cygwinを実行します(デスクトップにいるときにこの答えをよく見て、動作を少し変更する予定です)
Chris H

2

以下がbash(LinuxまたはMac OS X)のソリューションです。Windowsでは、Cygwinをインストールしてのコピーを取得できます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

(Linux)bashを使用した別のバージョンがありfindます。Ben Pingilleyの回答と同様に、CygwinをインストールしてWindowsでbashを取得できます。

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

この問題に関する私の見解を以下に示します。ここで述べた以前のスクリプトから多くの良いアイデアが生まれました。

これはOS X用のbashスクリプトです。同じベースファイル名とdng+jpg拡張子を持つファイルを探します。jpgがとまったく同じ名前で見つかった場合、dngそのファイル名が表示され(-e)、ファイルが移動(-m)または削除(-d)されます。

サブフォルダーを経由するため、カタログ全体または一部のみに使用できます。

他の生のファイル拡張子について*.dngは、スクリプト内でお好みの拡張子に置き換えるだけです。

警告:同じ名前で異なる拡張子を持つ2つの異なる画像を作成できます。これらは、このスクリプトの必然的な犠牲者です。

スクリプトの使用方法は次のとおりです。

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 

基本的な使い方は次のようになります。

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

これは、同じ名前のファイルとファイルのjpg両方を持つという基準に一致するファイルのすべてのファイル名をエコーし​​ます。dngjpg

結果は次のようになります。

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.

私はファイルを削除したい場合は今、私はちょうど切り替えるでしょう-e-d

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

または、ファイルを/ duplicatesに移動する場合は、で実行し-mます。

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

今、重複jpgファイルは/Volumes/photo/DNG/2015/duplicates

スクリプトは次のとおりです。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

これbashMac OS Xのスクリプトです。それは可能いくつかの変更をLinux上で動作します。

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

rmtrashファイルを完全に削除するのではなく、ゴミ箱に移動するユーティリティです。したがって、MacPortsから取得できます。

sudo port install rmtrash

これを回避したい場合rmtrashは、スクリプト内でを置き換えるだけで、rmすぐにJPGファイルが削除されます。


1

次のPythonスクリプトを作成しましたttaveiraのスクリプトと比較すると、追加の作業が行われます。

  • サブディレクトリを検索します。
  • 宛先廃棄ディレクトリを作成します。
  • 移動エラーを回避するために、廃棄ディレクトリに既に存在するファイルを削除します。

# 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
こんにちは、Photo.SEへようこそ。あなたの答えはttaveiraの答えとどう違うのですか?
SaaruLindestøkke

スクリプトは、いくつかの余分な仕事はない:それは何が存在しませんし、それがすでに廃棄ディレクトリ(ことを回避するには、エラーを動かす)に存在する場合にJPGを削除する代わりに、それならば移動した場合にも、すべてのサブディレクトリに見えます、JPGのための先の廃棄物のディレクトリが作成されます
トミー14

0

Mac OS Xでの作業では、前の回答で「同じコンテンツ」の健全性チェックが欠落していました。カメラの画像カウンターを有効にするのを忘れていたため、異なる写真の名前が重複していました。同じバージョンのEXIF情報をチェックする私のバージョンは次のとおりです。

実行する必要があります

sudo port install rmtrash exiv2

次のコマンドを使用する前に。これは、比較するために書かれたJPGNEF私のニコンD90からのファイル。必要に応じてファイル拡張子を調整します。

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

健全性チェックなしでは、全体が非常に短い1つのライナーになります。

find . -name \*.NEF |sed s/\.NEF/.JPG/g | xargs find 2>/dev/null | xargs rmtrash
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.