答え1
コードは不必要に複雑です。問題は、mv
ターゲットディレクトリがまだ存在しないと呼び出すことができないことです。また、コンテンツをルートディレクトリのディレクトリに移動しようとしているようです。
考える
#!/bin/sh
for suffix do
mkdir -p -- "$suffix" || exit 1
mv -- *."$suffix" "$suffix"
done
または、
#!/bin/bash
suffixes=( "$@" )
for suffix in "${suffixes[@]}"; do
mkdir -p -- "$suffix" || exit 1
mv -- *."$suffix" "$suffix"
done
(ディレクトリを生成できないときにスクリプトを終了するのではなく、次の指定されたサフィックスに移動するには、それを変更しますexit 1
。)continue
これはすべてのファイル名サフィックスを繰り返します(実際にはそうではありません)。ファイルタイプ「一般ファイル」、「ディレクトリ」、「シンボルリンク」などのUnixのファイル形式)対応するサフィックスと呼ばれるサブディレクトリが現在のディレクトリに作成され、そのサフィックスで終わるすべてのファイルが作成されます."$suffix"
。サフィックスはディレクトリに移動されます。
ディレクトリがすでに存在する場合、コマンドはmkdir -p dirname
失敗しません。dirname
例を実行してください:
$ tree
.
|-- file1.mp3
|-- file1.png
|-- file1.txt
|-- file2.mp3
|-- file2.png
|-- file2.txt
|-- file3.mp3
|-- file3.png
|-- file3.txt
|-- file4.mp3
|-- file4.png
|-- file4.txt
|-- file5.mp3
|-- file5.png
|-- file5.txt
`-- script.sh
0 directory, 16 files
$ ./script.sh txt mp3
$ tree
.
|-- file1.png
|-- file2.png
|-- file3.png
|-- file4.png
|-- file5.png
|-- mp3
| |-- file1.mp3
| |-- file2.mp3
| |-- file3.mp3
| |-- file4.mp3
| `-- file5.mp3
|-- script.sh
`-- txt
|-- file1.txt
|-- file2.txt
|-- file3.txt
|-- file4.txt
`-- file5.txt
2 directories, 16 files
答え2
mvコマンドを使用すると、実際にはルートディレクトリからフォルダに移動しようとします。コマンドは現在のディレクトリから出なければなりません。
mv *.${myarray[$index]} ./${myarray[$index]}/
以前のディレクトリを書き留めます.
。現在のディレクトリでフォルダを検索するように求められます。それ以外の場合は、単に次のように書くことができます。
mv *.${myarray[$index]} ${myarray[$index]}/
上記のコマンドは、現在のディレクトリのフォルダも探します。