8

たくさんのファイルがあります

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

これが基本的な質問である場合は申し訳ありません。Webを検索してみましたが、結果がありません。

4

2 に答える 2

7

=割り当ての前後に空白は使用できません。

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

逆に、テストでは空白が必要です。

if [ -e $dir ]; then
    ^       ^

文体の改善に関しては、不必要なことをしても問題はないので、ステートメントmkdir -pを取り除くことができます。if

割り当てには引用符は必要ないため、行から引用符を削除できますdir=。ただし、他の場所では引用符を付けることをお勧めします。他の引用符は削除しないでください。

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

for file in {BR,W0}*.*; do
    dir=${file%%.*}
    mkdir -p "$dir"
    mv "$file" "$dir"
done
于 2012-10-22T22:18:28.227 に答える
0

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

for file in BR* WO*
do
dir=$(echo ${file} | awk -F. '{print $1}' OFS=.)
mkdir $dir
mv $file $dir
done

私も同様の状況にあり、これは私にとってはうまくいきました。

于 2016-10-21T12:59:32.683 に答える