フォルダ内のすべてのファイル名の一部を削除しますか?

フォルダ内のすべてのファイル名の一部を削除しますか?

私のカメラは次の形式で写真を保存します。

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

同時にすべての名前を変更します。

関連情報