私のカメラは次の形式で写真を保存します。
DSC_0001 (2015_07_30 10_34_56 UTC).NEF
DSC_は繰り返し後の数字と時刻と日付を指定する括弧ですが、すべての時刻と日付情報はメタデータにあるので、生成されるすべてのファイルの名前を次のように変更したいと思います。
DSC_0001.NEF etc
Bashでコマンドを見ましたが、rename
私が望むことをする方法を理解することはできません。フォルダ内のすべてのファイルを変更したいと思います。
提案が効果的な理由を説明していただきありがとうございます。後で同様の問題を解決する方法を学ぶことを試みることができます。
メモ:違いがあればBashを使っています。
答え1
Perlの名前変更ツールを使用してください。
rename 's/ \(.*?\)//' *.NEF
正規表現は単純でなければなりません(.*?
最も短い文字列と一致)。
とても醜いDebian / Ubuntuの名前変更ユーティリティがCentOSなどの他のディストリビューションの名前変更ユーティリティと異なるのはなぜですか?2つの異なるコマンドについてrename
。
答え2
ファイルがある場合一つサブディレクトリがないフォルダphotos
:
for pathname in photos/*(*).NEF; do
newname=${pathname##*/}
newname=${newname%% '('*}.NEF
printf 'Would move "%s" to "%s"\n' "$pathname" "${pathname%/*}/$newname"
# mv -i "$pathname" "${pathname%/*}/$newname"
done
photos
これは、aを含む名前を繰り返し、(
現在).NEF
のパス名からディレクトリ名を削除し、残りの␣(
内容から後のすべての内容(スペースと)を削除し、名前の末尾に追加して新しいファイル名を作成します。(
.NEF
ファイルの実際の名前変更は安全上の理由からコメントアウトされています。
上記のコードの出力例:
Would move "photos/DSC_0001 (2015_07_30 10_34_56 UTC).NEF" to "photos/DSC_0001.NEF"
ファイルがより大きなディレクトリ構造のどこかにある場合:
find photos -type f -name '*(*).NEF' -exec sh -c '
for pathname do
newname=${pathname##*/}
newname=${newname%% \(*}.NEF
printf "Would move "%s" to "%s"\n" "$pathname" "${pathname%/*}/$newname"
# mv -i "$pathname" "${pathname%/*}/$newname"
done' sh {} +
ここで唯一の違いは、ループに対して関連ファイルのパス名が生成される方法です。この場合、find
見つかったパス名はループに一括して渡されますが、ループ自体はこの回答の最初の部分と同じです(引用符がわずかに変更されます)。
関連:
答え3
(
すべてのファイル名(パスを除く)にスペースカッコ()ペアがある場合は、次のものを使用できます。
mv "$f" "${f%% (*}.NEF"
すべてのファイルを繰り返すには:
$ for f in dir/*\(*\).NEF; do [ -f "$f" ] && mv "$f" "${f%% (*}.NEF"; done
答え4
ファイルと同じディレクトリになければなりません。
let a=0; for i in *.NEF; do let a=a+1; b=`basename $PWD`; c=`printf %04d$b.NEF $a`; mv $i $c; done
同時にすべての名前を変更します。