0

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

我确实有 26 个目录(A - Z),并且在每个目录下面又是完整的字母 AZ。文件名长度为 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 上工作

4

2 回答 2

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
于 2013-04-27T20:41:50.613 回答
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
于 2013-04-27T21:03:25.487 回答