2017-08-15 12 views
1

で持っている二つのディレクトリ finch_data/filteredfirst /ファイルと を整列 は、ファイル名の一部からフォルダを作成し、そこにファイルを対応する移動 - のbashスクリプト

firstZBND1X.sam 
firstZBND2V.sam 
firstZBND3X.sam 
firstZBND4X.sam 
firstZBND5X.sam 

と finch_data/filteredsec /整列

secZBND1X.sam 
secZBND2V.sam 
secZBND3X.sam 
secZBND4X.sam 
secZBND5X.sam 

私はフォルダを作成しました。 finch_data/filteredsec/combined 私はすべての最初の* .samとsec * .samファイルを移動しました。

ここでは、接頭辞firstまたはsecと.samの間にファイルmanesを使用して個別のサブフォルダを作成する必要があります。したがって、フォルダは次のようになります:

ZBND1X 
ZBND2V 
ZBND3X 
ZBND4X 
ZBND5X 

そして、これらの名前の文字列のファイルを対応するフォルダに移動する必要があります。

誰かがこれを行うには1行のbashを使用していますか?

#!/bin/bash 

prefix=first 
for file in ${prefix}*; do 
    base="${file%.sam}" 
    dir="${base#$prefix}" 
    mkdir -p "$dir" 
    mv "$file" "$dir" 
done 

をそれはかわいいonelinerではありません。

これは私が他のフォーラム

find . -name "*.sam" -exec sh -c 'mkdir "${1%.*}" ; mv "$1" "${1%.*}" ' _ {} \; 

答えて

3

これはfirst(同様secのためにそれを行う)が付いたファイルのためにそれを行うだろうからだ近いですしかし、それは可読です。あなたが望むなら、それを1行に書くことができます。必要に応じて

私たちは、単にDIR場合-pで、我々はすでに警告を取得しない、(そのディレクトリを作成し、知られている拡張子と知られている接頭辞をストリッピングによりdir名前を計算し、$prefixで始まる現在のディレクトリ内のすべてのファイルを反復処理します存在する)、最後にターゲットディレクトリ内のファイルを移動します。もしあなたが望むのであれば、ファイル名を別のものに変更したり、ディレクトリ名をファイル名などから削除したりすることもできます。

+0

または、finch_data/filtered * do ... 'とそれから' prefix = $ {i ## * filtered} 'を使って、それを微調整するだけです。 –

+0

できます。私はちょうど私の答えを "path-agnostic"にしたいと思っていました。 :) – randomir

+0

いいえ、私はちょうど良い方法であなたの答えが好きです。私はちょうどそれに考えを追加コメントを落とした '): –

関連する問題