ファイル名はそれぞれ異なるが同じ場所にある、中央の 4 文字を削除して複数のファイルの名前を変更するにはどうすればよいでしょうか?

ファイル名はそれぞれ異なるが同じ場所にある、中央の 4 文字を削除して複数のファイルの名前を変更するにはどうすればよいでしょうか?

Bash を使用して、中央の 4 文字を削除してファイル名を変更したいと思います。

元のファイル名:

dwe_hiul123456.pdf
dwe_lkyd345876.pdf
dwe_ythn157843.pdf

中央の 4 文字を削除して、新しいファイル名を次のようにします。

dwe_123456.pdf
dwe_345876.pdf
dwe_157843.pdf

4 文字は常に に続き_、ファイル名には必ず 1 文字含まれます_。ファイル名はすべて同じ長さで、削除したい 4 文字は同じ場所にあります。

私はこの分野にまったく不慣れで、Windows 10 を使用していること以外、どのバージョンを使用しているのかわかりません。Git Bash コマンド ウィンドウからこれを実行しようとしていました。

答え1

perl-rename ( renameDebian ベースのシステムでは利用可能、perl-renameその他では利用可能) をお持ちの場合は、次の操作を実行できます。

$ rename -n 's/_..../_/' *pdf
dwe_hiul123456.pdf -> dwe_123456.pdf
dwe_lkyd345876.pdf -> dwe_345876.pdf
dwe_ythn157843.pdf -> dwe_157843.pdf

-nrename変更を加えずに何が行われるかだけを印刷します。 期待どおりに動作することを確認したら、 を削除し-n、コマンドを再度実行して、実際にファイルの名前を変更します。

rename 's/_..../_/' *pdf

何らかの理由で使用できない場合はrename、単純なシェル ループを使用して実行することもできます。

for file in *pdf; do
    echo mv -- "$file" "${file/_????/_}"
done

もう一度、これが目的の動作であると確信している場合は、 を削除してecho実際にコマンドの名前を変更します。

for file in *pdf; do
    mv -- "$file" "${file/_????/_}"
done

答え2

使用パラメータ拡張:

$ for i in *.pdf; do
    echo mv -- "$i" "${i/_[a-z][a-z][a-z][a-z]/_}"
    #  actual `mv` command
    # mv -- "$i" "${i/_[a-z][a-z][a-z][a-z]/_}"
  done
mv -- dwe_hiul123456.pdf dwe_123456.pdf
mv -- dwe_lkyd345876.pdf dwe_345876.pdf
mv -- dwe_ythn157843.pdf dwe_157843.pdf

結果に満足したらecho、それを削除して実際にコマンドを実行します。

関連情報