web-dev-qa-db-ja.com

複数のファイル名でドットを下線に変更するにはどうすればよいですか?

次のような名前のファイルが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

どうやってやるの?

3
Mohadeseh

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
7
terdon

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つのダッシュはこれを防ぎます)。

5
Kusalananda

機能しない理由

*は、コマンドが実行される前に、シェルによって展開されます。既存のファイルと一致します。 mvにはパターンマッチング機能がありません。

ソリューション

mmv

このコマンドは、実行しようとしている方法とほとんど同じように機能します。 renameほど強力ではありませんが、単純です。

例えばmmv '*.assembled.*.fastq.gz' '#1_assembled_#2fastq.gz'

2
ctrl-alt-delor