ファイル名の部分文字列に基づいてディレクトリからファイルを移動する方法

ファイル名の部分文字列に基づいてディレクトリからファイルを移動する方法

私はUnix / Linuxシステムでスクリプトと作業に初めて触れたので、助けてくれて本当に感謝します。この質問は以前に答えたことがあると確信していますが、他の解決策のどれも私の状況に適していない理由はわかりません。

複数のgzipで圧縮されたASCIIテキストファイルを含むディレクトリがあります。文字列rbitおよびが名前の5番目と6番目の場所にあるかどうかに応じて、ファイル名に基づいて区切る必要がありますv3v4

以下は、ディレクトリ内のファイル名がどのように見えるかについての例です。

M07Zv3REP1_S442_L001_R1_001.fastq.gz  
M07Zv3REP1_S442_L001_R2_001.fastq.gz  
M18ZitREP3_S276_L001_R2_001.fastq.gz  
M10ZrbREP3_S535_L001_R1_001.fastq.gz  
M10ZrbREP3_S535_L001_R2_001.fastq.gz  
M09Zv4REP1_S300_L001_R1_001.fastq.gz  
M09Zv4REP1_S300_L001_R2_001.fastq.gz  

さまざまなgrepオプションを試しましたが、すべてのファイルを返します。例えば

grep -FLZ "rb" *.fastq.gz

私はxargsを使ってgrepファイルを新しいディレクトリに移動すると思いますが、一致する正しいzipファイルを取得する方法について心配しています。問題は、grepがすべてのfastqファイルで検索することです。この場合、どこかに「rb」または「it」がある可能性があるため、すべてが返されます。

どんな助けでも大変感謝します!

答え1

はい、あなたが言ったように、grepコマンドはファイル名の中を検索します。ファイルが圧縮されているため、バイナリデータで検索し、ファイルが十分に大きい場合は、そこからほとんどのランダムな2文字の文字列を見つけることができます。 thyが圧縮されていない場合でも、fastq品質行でこれらの文字列を見つけることができます。

このツールはファイル名ではなくファイルの内容を検索するため、正しいツールではgrepありません。この場合、単純なシェルのワイルドカードだけが必要です。表示されている例のように、文字列の1つがある場合、またはファイルを定義するのに十分であると100%確信している場合は、次のようにv3v4ますrbit

mkdir v3 v4 rb it
for pat in v3 v4 rb it; do mv -- *"$pat"*gz "$pat"/; done

名前に含まれているが5番目と6番目の場所にないファイルが計算されないように、特定の場所も考慮する必要がある場合は、次のように表示する必要がありますv3

mkdir v3 v4 rb it
for file in *gz; do 
    pat=$(printf '%s' "$file" | cut -c 5-6)
    mv -- "$file" "$pat"/
done

関連情報