ファイル名の部分文字列でファイル名を一括変更する

ファイル名の部分文字列でファイル名を一括変更する

ファイルがあります

..
00016_0912RP10R6_RampMotorway9_0912RP10R6_13.646852_100.687103.jpg
00017_0912RP10R6_RampMotorway9_0912RP10R6_13.646956_100.686897.jpg
00018_0912RP10R6_RampMotorway9_0912RP10R6_13.647067_100.686684.jpg
...

持ちたい

00016.jpg
00017.jpg
00018.jpg

サブフォルダを繰り返して名前を変更するための最良のLinuxコマンドは何ですか?

ベストアンサー1

使用find:

find . -type f -name '*_*.jpg' -exec sh -c '
    for pathname do
        newname=${pathname##*/}
        newname="${pathname%/*}/${newname%%_*}.jpg"
        printf "Would move %s to %s\n" "$pathname" "$newname"
        # mv -i "$pathname" "$newname"
    done' sh {} +

これは、名前が指定されたパターンと一致する現在のディレクトリ内または下のすべての一般ファイルのパス名を探します。これらのパス名のバッチに対して指定されたパス名を繰り返し、ファイル名を変更する短いシェルスクリプトが実行されます(実際の名前変更は安全のためにコメントアウトされます)。

同様のパス名が与えられると、./a/b/c/foo0_some_other_bits.jpgシェルスクリプトは./a/b/c/foo0.jpg最初にディレクトリを削除(作成)してから、最初の文字以降foo0_some_other_bits.jpg_すべてのエントリを削除し、ディレクトリを再追加してそれを変換します。パス名のディレクトリビットは、1つ以上の文字が含まれている場合は削除され置き換えられます_。これは標準パラメータ拡張を使用して行われます。

globstarシェルオプションを使用してくださいbash

shopt -s globstar   # use "set -o globstar" in ksh93, or remove completely in zsh
for pathname in ./**/*.jpg; do
    [ -f "$pathname" ] || continue
    newname=${pathname##*/}
    newname="${pathname%/*}/${newname%%_*}.jpg"
    printf "Would move %s to %s\n" "$pathname" "$newname"
    # mv -i "$pathname" "$newname"
done

これは上記のコマンドとまったく同じですfind。唯一の違いは、隠された名前が見つからないことです(shopt -s dotglobこれを追加しました)。

おすすめ記事