2012-10-22 8 views
6

ファイル名からディレクトリを作成し、移動し、私は私が最初にアップしたファイル名の最初の部分に基づいて、一連のディレクトリを作成したいファイルbashの

BR0200.aaa.tsv 
BR0200.bbb.tsv 
BR0200.ccc.tsv 
BR0210.aaa.tsv 
BR0210.bbb.tsv 
BR0210.ccc.tsv 
W0210.aaa.tsv 
W0210.aaa.tsv 
W0210.aaa.tsv 

の負荷を持っています「」

BR0200 
BR210 
W0210 

適切なディレクトリ(BR0200。*ファイルからBR0200ディレクトリ)に関連ファイルを移動します。

私はbashスクリプトでスタブを持っていましたが、エラーが続いています。どんな助言も感謝して受け取ります。

#!/bin/bash 

for file in BR* W0*; do 
dir = "${file%%.*}" 
if [-e $dir];then 
mv "$file" "$dir" 
else 
mkdir -p "$dir" 
mv "$file" "$dir" 
fi 
done 

申し訳ありませんが、これは基本的な質問です。私はウェブを検索しようとしましたが、結果はありません。

+0

@owlsteadどういう意味ですか? –

+0

@wlsteadグロビングは、シェルが提供しなければならない最も有用な機能の1つです。 – jordanm

+0

@jordanmあなたはもちろん、コメントを削除します。 –

答えて

6

割り当て内の=の周囲には空白がありません。

dir="${file%%.*}" 

逆に、空白は試験にを必要あります。

if [ -e $dir ]; then 
    ^ ^

は限り文体の改善として、それが不要なmkdir -pを行うには害はありませんので、あなたはif声明を取り除くことができます。

割り当てに引用符は不要なので、dir=行から引用符を削除できます。引用符で囲むことは他の場所では良いアイデアなので、他の引用符は削除しないでください。

.*をforループに追加するとよい場合があります。そうすれば、スクリプトを2回以上実行すると、新しく作成されたサブディレクトリを移動しようとはしません。そして、きちんとしたトリック(必ずしも改善ではないが)は、BR*.* W0*.*から{BR,W0}*.*に短縮することです。

for file in {BR,W0}*.*; do 
    dir=${file%%.*} 
    mkdir -p "$dir" 
    mv "$file" "$dir" 
done 
0

あなたはこのような何かを試すことができます。

BR *のファイルのWO *; はDIR = $ください($ {ファイル}エコー|。。awkの-FをOFS = '{$ 1印刷}')

を行って ます。mkdir $ dirを MV $ファイル$ DIR を私は似たような状況があったし、これは働いていました私のために。