2013-04-27 83 views
0

我有大约1000个文件(png),需要将它们移动到相应的目录及其子目录中。Bash:读取文件并移入子目录

我确实有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 

问题是)则不会创建子目录和b)的文件不会移动。对脚本有任何建议或更好的想法?

感谢

PS:我想这是显而易见的,它相当长的一段年前就是我创建的任何的bash脚本或编码,所以请多多包涵。 PSS:在Mac OSX上的bash工作3.2

回答

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是文件$ 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 
+0

非常感谢!这绝对是信息,我很惊讶我犯了多少错误。 – AtaDas 2013-04-27 21:28:05

+0

如果你喜欢我的回答,我会欢迎upvote :-) – 2013-04-27 21:30:39

+1

想upvote,但不能。我确实得到了我需要15点声望才能做到的信息。抱歉。 – AtaDas 2013-04-27 21:45:37

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 
+0

也适用于只有一个错误。第二个目录名称确实开始两位数字而不是一个。不过,也非常感谢。 – AtaDas 2013-04-27 21:43:25

+0

固定的'second = $ {item:1:2}'应该是'second = $ {item:1:1}' – 2013-04-27 21:48:31

+0

是的,有效。干杯。 – AtaDas 2013-04-27 21:49:52

相关问题