bash shell脚本根据年份和月份创建子目录

时间:2014-04-02 18:56:38

标签: linux bash shell aix

描述:列表/home/foo/dirlist.txt包含/ tmp / a .. / tmp / z

目标:创建子目录,例如/ tmp / a / 2014/04,/ tmp / b / 2014/04 ... / tmp / z / 2014/04

错误:当文件只有一个目录(例如/ tmp / a)时,它只会创建子目录 并且在执行后预期最终结果为/ tmp / a / 2014/04。但是,当文件有多个条目,例如/ tmp / a ... / tmp / z 没有创建子目录*

我如何实现目标?非常感谢任何提示和指示。

## /home/foo/dirlist.txt contains /tmp/a  /tmp/b .. /tmp/z
archdirs=`/usr/bin/cat "/home/foo/dirlist.txt"` 

YYYY=`/usr/bin/date '+%Y'`
MM=`/usr/bin/date '+%m'`

for i in "${archdirs[@]}"; 
do 
    if [ ! -d "$i/${YYYY}/${MM}" ]; then
            /usr/bin/mkdir -p "$i/${YYYY}/${MM}"
fi
done

2 个答案:

答案 0 :(得分:2)

请理解这个答案不是鱼,这是一个钓鱼课。

首先使用一些print语句调试它,看看数组迭代甚至尝试使用你认为它正在使用的值。在尝试打印i是我甚至看到的所有?测试声明怎么样,测试甚至通过? (为什么还要检查行是否存在?只是逃避错误?)

然后,如果那不是问题,那就更深层次地移动等等。

如果我们不这样做,可能会有许多其他可能导致问题的可能性。

此时你应该意识到这个问题与mkdir,年,月,aix或你的bash语法之外的任何事情无关。

祝你好运!

答案 1 :(得分:1)

您的变量archdirs不是数组而是单个字符串。以这种方式更改脚本以逐行阅读:

archdirs=`/usr/bin/cat "/home/foo/dirlist.txt"` 

YYYY=`/usr/bin/date '+%Y'`
MM=`/usr/bin/date '+%m'`

cat "/home/foo/dirlist.txt" | while read i 
do 
    if [ ! -d "$i/${YYYY}/${MM}" ]; then
            /usr/bin/mkdir -p "$i/${YYYY}/${MM}"
fi
done