0

約 1000 個のファイル (png) があり、それらを対応するディレクトリとそのサブディレクトリに移動する必要があります。

26 個のディレクトリ (A ~ Z) があり、各ディレクトリの下に完全なアルファベット AZ があります。ファイル名は 6 文字/数字で、拡張子は png です (例: AH2BC0.png)。

ファイル AH2BC0.png をディレクトリ A に移動し、そのディレクトリ内でサブディレクトリ H に移動する必要があります (例: A->H->AH2BC0.png)。

実際には期待どおりに機能しない次のスクリプトを作成しました。

#!/bin/bash
ls >LISTE.txt
for i in LISTE.txt; do
a=$(cat $i | cut -b 1 | tr '[:lower:]' '[:upper:]')
b=$(cat $i | cut -b 2 | tr '[:lower:]' '[:upper:]')
mkdir -p $a/$b
cat $i | xargs mv $a/$b
rm $i
done

問題は、a) サブディレクトリが作成されず、b) ファイルが移動されないことです。スクリプトに関する提案やより良いアイデアはありますか?

ありがとう

PS: 私が bash スクリプトを作成したりコーディングしたりしたのは何年も前のことであることは明らかだと思いますので、ご容赦ください。PSS: MAC OSX bash 3.2 に取り組んでいます

4

2 に答える 2

3
#!/bin/bash
for item in *; do
    first=${item:0:1}
    second=${item:1:1}

    folder="$first/$second"
    mkdir -p $folder
    mv $item $folder/
done
于 2013-04-27T20:41:50.613 に答える
3

あなたが望むことを行うためのより良いプログラムを示す投稿がすでにありますが、あなたのプログラムを修正する方法を紹介したいと思いました。参考になると思います。

#!/bin/bash
ls >LISTE.txt
for i in LISTE.txt; do

これは、単一の値 LISTE.txt をループします。それを次のように置き換えます。

for i in $(cat LISTE.txt); do

代わりにファイルの内容をループします。

    a=$(cat $i | cut -b 1 | tr '[:lower:]' '[:upper:]')
    b=$(cat $i | cut -b 2 | tr '[:lower:]' '[:upper:]')

ファイルの内容ではなく名前を求めているため、上記の 2 行ではechoなく使用する必要があります。cat

    mkdir -p $a/$b
    cat $i | xargs mv $a/$b

$a/$b ディレクトリの名前を C に変更しようとします。ここで、C はファイル $iの内容です。それを次のように置き換えます。

    mv $i $a/$b

次の行は必要ありません。

    rm $i

したがって、単に削除してください。を使用してファイルを移動するのではなく、コピーした場合にのみ必要ですmv

done

これが、私が提案した変更後の​​完全なプログラムです。

#!/bin/bash
ls >LISTE.txt
for i in $(cat LISTE.txt); do
    a=$(echo $i | cut -b 1 | tr '[:lower:]' '[:upper:]')
    b=$(echo $i | cut -b 2 | tr '[:lower:]' '[:upper:]')
    mkdir -p $a/$b
    mv $i $a/$b
done
于 2013-04-27T21:03:25.487 に答える