文字が異なるファイルのセットがあります。例:
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