Bashでファイル名を変更するときに、ファイル名の部分文字列の順序を変更しますか?

Bashでファイル名を変更するときに、ファイル名の部分文字列の順序を変更しますか?

何百ものファイルがあり、すべて同じテンプレートに従う名前を持っています。

results_20210503_input003_run017_cluster003.txt

Bashで部分文字列を並べ替える有効な方法ですか?

results_input003_cluster003_run017_20210503.txt

cut -f$iを使用して各フィールドをインポートしてから、をmv使用してファイルの名前を変更しようとしましたが、それは間違って見えます。

答え1

使用Perlのrenameコマンドラインツール(オペレーティングシステムによっては、またはとrename呼ばれる場合があります):perl-renameprename

rename 's/(results)(_[0-9]{8})(.*)(\.txt)/$1$3$2$4/' results*txt

-n名前の変更を表示するには - フラグを使用してテストを実行してみてください。

仕組み:

  • s/A/B/- ファイル名のパターン A をパターン B に置き換えます。
  • 括弧内のパターンには、発生時にインデックス番号が割り当てられます。
  • グループ化には以下が含まれます。 1)results:リテラル「結果」。 2)_[0-9]{8}:下線の後に0から9までの8桁の数字。 3).*. =すべての文字、* =可能な限り前の入力を繰り返します。 4)\.txtリテラル「.txt」は.エスケープする必要があります。それ以外の場合(3)のように「すべての文字」になります。
  • 必要に応じてパターングループを並べ替えます。以下を参照してください。$<ID>

答え2

オペレーティングシステムについて言及していないので、どのツールが利用可能かを推測することは困難です。私はmmvこのような状況が最も簡単だと思います。正規表現の代わりにシェルグローブを使用します。

$ mmv -n 'results_*_*_*_*.txt' 'results_#2_#4_#3_#1.txt'
results_20210503_input003_run017_cluster003.txt -> results_input003_cluster003_run017_20210503.txt

-n提案された名前の変更に満足したら削除してください。


必ずしなければならないなら」バッシュから」、その後

for f in results_*.txt; do 
  IFS=_ read -a elems <<<"${f%.txt}"
  echo mv -n "$f" "results_${elems[2]}_${elems[4]}_${elems[3]}_${elems[1]}.txt"
done
mv -n results_20210503_input003_run017_cluster003.txt results_input003_cluster003_run017_20210503.txt

echo実際にファイル名を変更するには削除してください。

関連情報