次の名前のファイルが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
インストールされている場合(rename
Debian、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
パターンマッチング機能がありません。
解決策
- Larry WallのPerlを使用して名前を変更する:参照https://unix.stackexchange.com/a/533925/4778
- ミリメートル波を使う
mmv
このコマンドは、実行したい操作と最も似ています。強力ではありませんが、rename
簡単です。
例えばmmv '*.assembled.*.fastq.gz' '#1_assembled_#2fastq.gz'