我有大约1000个文件(png),需要将它们移动到相应的目录及其子目录中。
我有26个目录(A - Z),每个目录下面还有完整的字母A-Z。文件名长度为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答案 0 :(得分: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
答案 1 :(得分: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:]')
您希望在上述两行中使用echo
而不是cat
,因为您在文件的名称之后而不是其内容。
mkdir -p $a/$b
cat $i | xargs mv $a/$b
我不认为上面这行符合您的想法......它会尝试将$ a / $ b目录重命名为C,其中C是文件$的内容一世。替换为:
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