Bash:读取文件并移入子目录

时间:2013-04-27 20:34:13

标签: macos bash

我有大约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

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