中間文字列をファイル名の末尾に移動してファイル名を変更します。

中間文字列をファイル名の末尾に移動してファイル名を変更します。

いくつかのデータファイルがありますが、パイプラインに合わせて名前を変更したいと思います。

ファイルは次のようになります。

{unique_ids}_{experiment_condition}_L{3_digit_number}.txt

次のように、ファイル名の末尾、拡張子の前に実験条件フラグが表示されるように名前を変更する必要があります。

{unique_ids}_L{3_digit_number}_{experiment_condition}.txt

Unique_ids と Experiment_condition の長さは固定されていません。

例:

ghad312fd2_Mb_L002.txtになるghad312fd2_L002_Mb.txt

ありがとうございます!

答え1

Perlベースのrenameユーティリティを使用して、現在のディレクトリ内のこのパターンに一致するすべてのファイル./*_*_*.txt(つまり、名前に複数のアンダースコアが含まれて終わるすべてのファイル.txt)の名前を変更します。

rename -n 's/([^_]+)_([^_]+)\.txt$/$2_$1.txt/' ./*_*_*.txt

ファイル名のサフィックスを除いて、ファイル名の最後の2つの下線で区切られた部分を置き換えます.txt-n正しい操作を実行しているように見えることを確認してから、削除して実際に実行してください。

答え2

シェルを含むzsh:

autoload zmv
zmv  -n '(*)(_*)(_L[0-9](#c3))(.txt)' '$1$3$2$4'

-n満足すれば削除(テスト実行))。

[0-9](#c3)3つのASCII 10進数シーケンスと一致します。また、<0-999>0から999までの数字(0000123にも一致します)または<->すべての数字(1つ以上のASCII 10進数シーケンス)を一致させることもできます。

答え3

また試み

for FN in gh*; do IFS="_." read ID XC NR EXT <<< "$FN"; echo mv -- "$FN" "${ID}_${NR}_${XC}.${EXT}"; done  

read「string here」の各ファイル名の4つの変数を使用し、それに基づいて新しいファイル名を再設定します。echoご覧の内容が気に入ったら削除してください。

答え4

unique_idsアンダースコアがないと仮定し、それをスクリプトに入れ、GNUsedまたは他のsedサポートされているスクリプトを使用して実行し、-Eファイル名を引数として渡します。

#!/bin/bash
for f in "$@" ; do
    new_name=$(echo "$f" | sed -E 's/([^_]+)_(.+)_(L[0-9]{3})\.txt/\1_\3_\2.txt/g')
    echo "$f -> $new_name"
    mv "$f" "$new_name"
done

関連情報