次のような名前のファイルが100個以上あります
x.assembled.forward.fastq.gz
x(n).unassembled.reverse.fastq.gz
問題は、私が作業しているパイプラインがファイル名の「ドット」を受け入れず、それらすべてを_
に変更する必要があることです。
x_assembled_forward.fastq.gz
x(n)_unassembled_reverse.fastq.gz
私はそれが簡単なコマンドを使用して可能であると思った:
mv *.assembled.*.fast.gz *_assembled_*.fastq.gz
....どうやらそうではない! :D
どうやってやるの?
Perl-rename
がインストールされている場合(Debian、Ubuntu、およびその他のDebian派生システムではrename
と呼ばれます)、次のことができます。
rename -n 's/\./_/g; s/_fastq_gz/.fastq.gz/' *fastq.gz
最初にすべての.
を_
に置き換え、次に最後の_fastq_gz
を.fastq.gz
に置き換えます。
-n
を指定すると、実際にファイルの名前を変更することなく、行う変更のみが印刷されます。これがあなたの望みどおりの動作をすることを確認したら、-n
を削除して実際に名前を変更します。
rename 's/\./_/g; s/_fastq_gz/.fastq.gz/' *fastq.gz
mv
は、単一のファイルを取得して移動または名前を変更するか、複数のファイルまたはディレクトリを取得してそれらをディレクトリに移動します。 mv
を使用して複数のファイルの名前を変更することはできません。
代わりに:
for name in *.*.fasta.gz; do
newname=${name%.fasta.gz} # remove filename suffix
newname=${newname//./_}.fasta.gz # replace dots with underscores and add suffix
mv -i -- "$name" "$newname"
done
これにより、ファイル名のサフィックスを除いて、名前の他の場所に少なくとも1つのドットを含む、現在のディレクトリ内のすべての圧縮fastaファイルが繰り返されます。既知のファイル名サフィックス(ドットをアンダースコアに置き換えないでください)を削除し、残りのビットですべてのドットをアンダースコアに置き換えて、サフィックスを再接続します。
最後の置換はbash
シェルで機能しますが、/bin/sh
で実行している場合は機能しない可能性があります。
次に、mv -i
を使用してファイルの名前を変更します(新しい名前が既に存在するかどうかの確認を求められます)。 2つのダッシュ(--
)は、名前がダッシュで始まる場合にのみ使用されます(これらは、mv
のオプションのセットとして使用される可能性があり、2つのダッシュはこれを防ぎます)。
*
は、コマンドが実行される前に、シェルによって展開されます。既存のファイルと一致します。 mv
にはパターンマッチング機能がありません。
mmv
このコマンドは、実行しようとしている方法とほとんど同じように機能します。 rename
ほど強力ではありませんが、単純です。
例えばmmv '*.assembled.*.fastq.gz' '#1_assembled_#2fastq.gz'