用于递归交换子文件夹的脚本

时间:2018-04-18 09:42:43

标签: scripting

几天来,我一直在努力解决问题。 我有一个目录结构,如:

   Dir/Documents/PersonA/
   Dir/Documents/PersonB/
   Dir/Pictures/PersonA/
   Dir/Pictures/PersonC/
   Dir/Mails/PersonA/
   Dir/Mails/PersonB/

我想将所有内容递归地更改为:

   Dir/PersonA/Documents/
   Dir/PersonA/Pictures/
   Dir/PersonA/Mails/
   Dir/PersonB/Documents
   Dir/PersonB/Mails
   Dir/PersonC/Pictures

我尝试了一些脚本,但因为一些dirs包含空格而被卡住了,因为我不够好......

1 个答案:

答案 0 :(得分:0)

在shell(bash,sh,zsh等)中,可以使用for循环:

for person in $(cd Dir/Documents/ ; ls); do
    for d in Documents Pictures Mails; do
        mv "Dir/$d/${person}" "Dir/${person}/$d"            
    done
done

编辑:在mv参数

附近添加了双引号

EDIT2:for不足以处理空格。 (+添加mkdir)

/bin/ls -d Dir/*/* | while read e; do
    persondir=$(echo $e | awk -F/ '{print $1"/"$3}')
    subfolder=$(echo $e | awk -F/ '{print $1"/"$3"/"$2}')
    mkdir -p "${persondir}"
    mv "$e" "$subfolder"
done