なぜ動作しないのか

なぜ動作しないのか

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

どうすればいいですか?

答え1

すでにperl-renameインストールされている場合(renameDebian、Ubuntu、およびその他のDebian派生製品から呼び出されます)、次のことができます。

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

答え2

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つのドットを含む現在のディレクトリ内のすべての圧縮されたファスタファイルを繰り返します。既知のファイル名のサフィックスを削除して(ドットをアンダースコアにすることはできません)、残りのビットのすべてのドットをアンダースコアに置き換えてサフィックスを再追加します。

最終的な置き換えはbashシェルで動作しますが/bin/sh

mv -iその後、ファイルの名前を変更するために使用されます(新しい名前がすでに存在することを確認するように求められます)。デュアルダッシュ(--)は、名前がダッシュで始まる場合にのみ使用されます(これらの名前はオプションのセットとして扱うことができ、デュアルmvダッシュはこれが発生しないようにします)。

答え3

なぜ動作しないのか

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

解決策

mmv

このコマンドは、実行したい操作と最も似ています。強力ではありませんが、rename簡単です。

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

関連情報