ファイル名から特定の文字を削除するbashコードは何ですか?

ファイル名から特定の文字を削除するbashコードは何ですか?

異なる文字を持つファイルセットがあります。たとえば、

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そのオプションが正しいことをしていることを確認したら、オプションを削除してください。

関連情報