ファイル名の変更

ファイル名の変更

現在、ディレクトリに次のファイルがあります。

 GCF_000901975.1_ViralProj181986_genomic.fna.gz  
 GCF_001885505.1_ViralProj344311_genomic.fna.gz
 GCF_000901995.1_ViralProj181990_genomic.fna.gz  
 GCF_001041015.1_ViralProj287961_genomic.fna.gz

現在のファイルの名前をこのように変更したい

 GCF_000901975.1
 GCF_001885505.1
 GCF_000901995.1
 GCF_001041015.1

以下のスクリプトを使用してインポートしますが失敗します。

 for file in `ls | grep .gz`
 do
    newfile=`echo $file | awk -F "_" '{print $1,"_",$2,".gz"| sed 's/ //g"`
    mv $file $newfile
 done

誰でも私にアドバイスを与えることができますか?あるいは、「分割」を試して監査する必要があるかもしれません。

答え1

まず、出力解析の防止ls。次に、ls出力を解析する必要がある理由(ここにはありません)があっても、それを渡す理由はありませんgrepls *gzで終わるファイルとディレクトリ名のみがリストされますgz(ただし、ディレクトリもリストされていることに注意してください)。で終わるコンテンツ名とは異なり、)やをgz使用しない限り、ファイルは一致せず、名前に改行文字を含むファイルと一致します。ls -dls | grep .gznot.a.gz.file

とにかく、lsここではまったく必要ないし望まない。必要なのは、for file in *gz任意のファイル名を処理できるため、これがより良いアプローチであることです(変数を正しく引用する限り)。

したがって、ループは次のようによく書くことができます。

for file in *.gz; do
    newfile=$(echo "$file" | awk -F "_" '{print $1"_"$2".gz"}' | sed 's/ //g')
    mv -- "$file" "$newfile"
 done

awk部品を開く前に閉じていないので、awkコマンドとsedコマンドを修正し、すべての変数をどのように引用したかをsed確認してください。また、印刷された各項目(または変数に設定した項目),の間にスペースを追加するときにawkステートメントを削除した方法を確認してください。これprintOFS-- コマンドラインオプションの終わりを示すために使用されます。そしてコマンドが-

次に、本当に必要ではないか、awkまったくsed必要ありません。シェルを使用できます。

for f in *gz; do 
    echo mv -- "$f" "${f%%_V*}"
done

構文${variable%%pattern}"${f%%_V*}") means "return the value of $variable after removing the longest string matching $pattern from the end". So, in this case, it means "remove everything from the first_V` which comes before a。これについての詳細を読むことができます。ここ:

${パラメータ%%単語}

単語が展開され、パターンが生成され、以下の規則に従って一致します(パターン一致を参照)。パターンがパラメータ拡張値の末尾の部分と一致する場合、拡張結果は、最短一致パターン(「%」ケース)または最長一致パターン(「%%」ケース)を持つパラメータ値を削除します。パラメータが「@」または「の場合'を使用すると、各位置引数にパターン除去操作が順番に適用され、拡張が結果リストになります。パラメータが配列変数の場合、下付き文字は「@」または「'パターン除去操作は配列の各メンバーに順番に適用され、拡張は結果のリストです。

期待どおりに機能することに満足したら、削除してやり直してecho実際にファイル名を変更してください。

最後に、perl-rename(DebianベースのLinuxディストリビューションから呼び出されます)がある場合は、rename次のこともできます。

$ rename -n -- 's/_V.*//s' *gz
GCF_000901975.1_ViralProj181986_genomic.fna.gz -> GCF_000901975.1
GCF_000901995.1_ViralProj181990_genomic.fna.gz -> GCF_000901995.1
GCF_001041015.1_ViralProj287961_genomic.fna.gz -> GCF_001041015.1
GCF_001885505.1_ViralProj344311_genomic.fna.gz -> GCF_001885505.1

よかったら、削除し-nて実際にファイル名を変更してください。

答え2

for i in $(ls GCF*.gz); do var=$(echo $i | awk -F "_" '{print $1"_"$2}'); echo $var; mv $i $var; done

awkメソッド

ls -ltr | awk '/GCF.*gz/{print "mv "$NF" "substr($NF,1,15)}'|sh

関連情報