答案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]}/
上面的命令还将查找当前目录中的文件夹。