パターンに一致するファイル名部分を抽出してファイル名を変更します。

パターンに一致するファイル名部分を抽出してファイル名を変更します。

そのようなファイルの名前を変更するためにどのコマンドを使用できるかを知りたいです。

たとえば、古いファイル名は次のようになります。

0_predict-1-500.png
0_predict-2-500.png
0_predict-3-500.png
1_predict-1-500.png
1_predict-2-500.png
1_predict-3-500.png
2_predict-1-500.png
...so on...

私が期待するものは、同様の形式で抽出してから、{filename}_predict-{times}-{rounds}.png他のパターン(例えば{filename}.png-result-{times}.png

したがって、上記のファイル名はパターンと一致するように変更されます。

0.png-result-1.png
0.png-result-2.png
0.png-result-3.png
1.png-result-1.png
1.png-result-2.png
1.png-result-3.png
2.png-result-1.png
...so on...

このようなことをすることができるLinuxコマンド/ツールを持っている人はいますか?私はこれを行うためにPythonスクリプトを書くことはしたくありません。

答え1

私はGNU / Linuxでファイル名を簡単に操作できるツールがあることを発見しました。ミリメートル波。これは公開された回答よりはるかに簡単です。

mmv "*_predict-*-*.png" "#1.png-result-#2.png"

各部分をワイルドカードパターンに置き換えようとするため、などを使用してその#1部分を再利用できます。#2

答え2

renameコマンドを使用して編集できます。すべてのファイルが同じディレクトリにあるとし、必要に応じてすべての.png名前を変更するドキュメント.:

find -name \*.png -exec sh -c 'x=$( rename -v 's/_predict/.png-result/g' $0 ) ;  rename  's/-500//g' "${x##*\./}" ;' {} \;

ファイルがあるディレクトリでこのコマンドを実行します。

したがって、デフォルトでは名前変更コマンドを2回実行します。最初は削除し_predict、2番目は削除します-500

x=$( rename -v 's/_predict/.png-result/g' $0 )初めてファイル名を変更した後、この新しい名前を変数に保存してから、そのx値を2番目の変更に使用するため、ここで使用します。

rename 's/-500//g' "${x##*\./}" ;xの値がこのため、命令を使用するだけです./0_predict-1-500.png renamed as ./0.png-result-1-500.png。だから私はこれをしたい0.png-result-1-500.png${x##*\./}思います。

答え3

また試み

$ for FN in *.png; do IFS="_-." read F P T R X <<< "$FN"; echo mv "$FN" "$F.$X-result-$T.$X"; done
mv 0_predict-1-500.png 0.png-result-1.png
mv 0_predict-2-500.png 0.png-result-2.png
mv 0_predict-3-500.png 0.png-result-3.png
mv 1_predict-1-500.png 1.png-result-1.png
mv 1_predict-2-500.png 1.png-result-2.png
mv 1_predict-3-500.png 1.png-result-3.png
mv 2_predict-1-500.png 2.png-result-1.png

echo結果が満足であれば削除してください。ターゲットファイルを繰り返し、read適応変数のファイル名コンポーネントと「ここに文字列」を使用してからコンポーネントをIFS再組み立てして、コマンドに必要な最終ファイル名を形成しますmv

答え4

名前を変更する必要があるファイルのすべてのファイルを参照してください。

awk  '{print "mv -v" " " $1 " " substr($1,1,1)".png-result-"substr($1,11,1)".png"}' filename |sh


I have mentioned -v for verbose mode

This is how it shows output for renaming

awk  '{print "mv -v" " " $1 " " substr($1,1,1)".png-result-"substr($1,11,1)".png"}' filename|sh

`0_predict-1-500.png' -> `0.png-result-1.png'
`0_predict-2-500.png' -> `0.png-result-2.png'
`0_predict-3-500.png' -> `0.png-result-3.png'
`1_predict-1-500.png' -> `1.png-result-1.png'
`1_predict-2-500.png' -> `1.png-result-2.png'
`1_predict-3-500.png' -> `1.png-result-3.png'
`2_predict-1-500.png' -> `2.png-result-1.png'

関連情報