1

家族全員の写真や動画を整理したい。サンプル コードがありますが、BASH コードの -tr または -sed コマンドと Phil Harvey による EXIFTOOL を使用してファイル名の文字を交換できません。誰にもアイデアがありますか?

#!/bin/bash
# scan the files you need

for i in *jpg *mov *jpeg *mpg; *avi *mp4 do

# Get the extension of the file

extension=${i##*.}

# Extract metadata from the file

datetime=$( exiftool -f -s3 -"DateTimeOriginal" "${i}" )

# If the datetime value is empty (returned '-' because of the '-f' option)
# then read another tag

if [ "${datetime}" = '-' ]; then
    datetime=$( exiftool -f -s3 -"MediaCreateDate" "${i}")
fi

# Construct the new filename from the metadata gathered above

newfilename="${datetime}.${extension}"


# Check if the destination filename already exists, and if not,
# create the file

if [ ! -e "${newfilename}" ]; then

 echo mv -v "${i}" "${newfilename}"

else
    echo "${i} would get renamed to ${newfilename} but that file already exists."
fi

done
4

1 に答える 1

4

これにはスクリプトは必要ありません。Exiftool だけで実行できます。

コマンドは次のようになります。
exiftool -ext jpg -ext mov -ext jpeg -ext mpg -ext avi -ext mp4 -d '[%Y-%m-%d][%A] [%H.%M.%S].%%e' '-Filename<MediaCreateDate' '-Filename<DateTimeOriginal' FileOrDir

( ) オプションは-ext-extension操作するファイル拡張子を制限します。
( -d)-dateFormatオプションとそれに続くフォーマット文字列は、日付/時刻タイプのタグに使用するフォーマットを Exiftool に指示します。Common Date Format Codesの下に詳細情報があります。

MediaCreateDate次の 2 つのオプションは、指定されたタグ (または)に従ってファイルの名前が変更されることを exiftool に伝えますDateTimeOriginal。同じタグへの以前の割り当て (この場合Filename) は、後の割り当てによって上書きされるため、DateTimeOriginal存在する場合はそれが使用され、そうでない場合は使用されますMediaCreateDate。どちらのアイテムも存在しない場合、マイナー エラーが発生し、ファイルの名前は変更されません。その名前のファイルが既に存在する場合も同じことが起こりますが%%c、ファイル名に増分番号を追加するために日付形式文字列に追加できます。

注意すべきことの 1 つはMediaCreateDate、動画ファイルは UTC に設定され、それを読み取るプログラムはタイムスタンプを現地時間に調整することになっていることです。Quicktime タグ ページの 4 番目の段落を参照してください。しかし、すべてのカメラ (通常は古いカメラ) が適切に設定できるわけではありません。Exiftool はタイムスタンプをそのまま返すため、正しくない可能性があります。exiftool で現地時間に合わせたい場合は、-api QuickTimeUTCオプションを追加できます。

testnameの代わりに使用したサンプル出力を次に示しfilenameます。

'X:/!temp/0615090217.jpg' --> 'X:/!temp/[2009-06-15][Monday] [02.17.00].jpg'
'X:/!temp/2013-07-18_12.19.38 - Copy.Jpg' --> 'X:/!temp/[2013-07-18][Thursday] [12.19.38].Jpg'
'X:/!temp/DSC_7689 after.JPG' --> 'X:/!temp/[2006-08-19][Saturday] [09.13.28].JPG'
'X:/!temp/FujiFilmFinePixF200EXR_F0Standard (Provia).jpg' --> 'X:/!temp/[2009-01-25][Sunday] [14.10.46].jpg'
'X:/!temp/FujiFilmFinePixS5Pro.jpg' --> 'X:/!temp/[2006-12-20][Wednesday] [07.20.58].jpg'
'X:/!temp/IMGP0713-XL.jpg' --> 'X:/!temp/[2011-03-10][Thursday] [14.10.54].jpg'
'X:/!temp/IMGP0852.jpg' --> 'X:/!temp/[2003-04-20][Sunday] [16.36.53].jpg'
'X:/!temp/IMG_0938.JPG' --> 'X:/!temp/[2000-01-02][Sunday] [03.04.10].JPG'
'X:/!temp/RCNX0001.JPG' --> 'X:/!temp/[2015-12-20][Sunday] [09.09.05].JPG'
'X:/!temp/Test1.mp4' --> 'X:/!temp/[2015-12-25][Friday] [15.46.15].mp4'
'X:/!temp/Test4.jpg' --> 'X:/!temp/[2010-07-05][Monday] [12.53.36].jpg'
'X:/!temp/Test4.mp4' --> 'X:/!temp/[2014-11-11][Tuesday] [11.11.11].mp4'
'X:/!temp/tif.jpg' --> 'X:/!temp/[2003-03-03][Monday] [03.03.03].jpg'
'X:/!temp/xyzzy.jpg' --> 'X:/!temp/[2012-04-04][Wednesday] [04.04.04].jpg'

これは、Linux/Mac で bash を使用することを前提としています。Windows CMD では、一重引用符が二重引用符に変更されます。-r( -recurse) オプションを追加して、サブディレクトリに再帰します。

于 2016-05-27T23:53:41.820 に答える