ファイル名のさまざまな文字を特定の時点まで削除する 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コメント アウトされています。 を有効にする前に、コードを 1 回実行して、正しく動作することを確認する必要がありますmv

さまざまなユーティリティの1つrename(Perlのモジュールに基づくものFile::Rename。さまざまなユーティリティがあります。「プレネーム、名前変更、ファイル名変更など、すべての名前変更とは何ですか?"):

rename -n -v 's/.*?_.*?_.*?_//' -- *.fastq

またはもっと短い、

rename -n -v 's/(.*?_){3}//' -- *.fastq

これは、上記のシェル コードとほぼ同じことを行いますが、Perl 置換を使用します。置換では、アンダースコア間の 3 つの部分文字列を非貪欲一致で一致させることにより、ファイル名文字列の最初のビットを削除します。正しい動作をしていると確信できる場合は、オプションを.*削除してください。-n

関連情報