いくつかのデータファイルがありますが、パイプラインに合わせて名前を変更したいと思います。
ファイルは次のようになります。
{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