異なる文字を持つファイルセットがあります。たとえば、
IDNR19_15_037_S514_L001_R1_001.fastq
IDNR19_02_016_S238_L001_R1_001.fastq
S514
前のすべての文字を削除し、S238
その後のすべての文字を維持したいと思います。私の例のように、ファイルの番号が異なる場合、これは可能ですか?
約1,100個のファイルがあるため、手動で実行するには時間がかかります。
私ができる最も近いものは次のとおりです。
rename 's/IDNR19_//g' *.fastq
IDNR19_部分を削除しましたが、問題は解決しません。
答え1
変数やテキストファイルに格納されている文字列ではなく、名前を変更したいディスクのファイル名であるとします。単純なシェルループを使用できます。
for name in *.fastq; do
newname=${name#*_*_*_}
printf 'Would move "%s" to "%s"\n' "$name" "$newname"
# mv -i -- "$name" "$newname"
done
これは、パターンに一致する現在のディレクトリのすべての名前を繰り返します*.fastq
(パターンをに変更することで、パターンに対してより具体的に指定できますIDNR*.fastq
)。各ファイル名に対して、ファイル名ワイルドカードパターンに一致するプレフィックスを削除して新しい名前を設定します*_*_*_
。これは以下を使用して行われます。標準パラメータ拡張。
これはセキュリティ上の理由からmv
コメントされています。起動時にmv
。
さまざまなユーティリティrename
(PerlモジュールベースのユーティリティFile::Rename
、さまざまなユーティリティがあります、」を参照)のいずれかを使用してください。名前の変更、名前の変更、ファイルの名前変更など、すべての名前変更操作はどうなりますか?"):
rename -n -v 's/.*?_.*?_.*?_//' -- *.fastq
またはより短い、
rename -n -v 's/(.*?_){3}//' -- *.fastq
これは上記のシェルコードとほぼ同じことを行いますが、代わりにPerlを使用します。置換は、非欲張りな一致を使用して、下線の間の3つの部分文字列を一致させ、ファイル.*
名文字列の最初のビットを削除します。-n
そのオプションが正しいことをしていることを確認したら、オプションを削除してください。