Bash目录展平和重命名

时间:2013-09-22 09:28:55

标签: linux bash find

我有以下文件夹结构......

/main/2000/01_January/a.jpg
/main/2000/01_January/b.jpg
/main/2000/04_April/a.jpg
/main/2000/04_April/b.jpg
/main/2000/04_April/c.jpg
/main/2001/02_February/a.jpg
/main/2002/06_June/a.jpg

等...

我需要一个bash脚本以下面的方式展平这个结构。我想删除第二级文件夹(2000年,2001年,2002年等),并通过插入第二级文件夹名称并截断“_ 月份名称”来重命名第三级文件夹。结果应该是这样的......

/main/2000-01/a.jpg
/main/2000-01/b.jpg
/main/2000-04/a.jpg
/main/2000-04/b.jpg
/main/2000-04/c.jpg
/main/2001-02/a.jpg
/main/2002-06/a.jpg

等...

2 个答案:

答案 0 :(得分:1)

你可以这样做:

x='/main/2000/01_January/a.jpg'
a=( $(IFS=/ read -a a <<< "$x" && echo ${a[@]}) )
y=$(printf "/%s/%s-%s/%s" ${a[0]} ${a[1]} ${a[2]/_*/} ${a[3]})
echo "$y"

<强>输出:

/main/2000-01/a.jpg

答案 1 :(得分:1)

find /main/????/[0-9][0-9]_*/ -type f | while read -r FILE; do
    DEST=${FILE:0:10}-${FILE:11:2}/
    echo "Moving $FILE to $DEST."
    mkdir -p "$DEST" && mv "$FILE" "$DEST"
done

# rm -fr /main/????/