何百ものファイルがあり、すべて同じテンプレートに従う名前を持っています。
results_20210503_input003_run017_cluster003.txt
Bashで部分文字列を並べ替える有効な方法ですか?
results_input003_cluster003_run017_20210503.txt
cut -f$i
を使用して各フィールドをインポートしてから、をmv
使用してファイルの名前を変更しようとしましたが、それは間違って見えます。
答え1
使用Perlのrename
コマンドラインツール(オペレーティングシステムによっては、またはとrename
呼ばれる場合があります):perl-rename
prename
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
実際にファイル名を変更するには削除してください。