Mac OS X终端批量重命名...但具有文件夹路径

时间:2015-06-26 17:58:47

标签: macos batch-file

我尝试错误地将我的问题添加到一个非常类似的线程中,这里有很好的解决方案:

mac os x terminal batch rename

我基本上有同样的问题,但我想要这样做并在重命名时更改文件夹路径。这就是我的问题:

这些解决方案中的任何一个都可以将下划线更改为文件夹路径吗?例如,我在一个级别上有需要嵌套的mbox文件,例如:

TopLevel_NextLevel_mbox
TopLevel_NextLevel_FinalLevel_mbox

我想自动将它们放在这样的层次结构中:

TopLevel/NextLevel/mbox
TopLevel/NextLevel/FinalLevel/mbox

可以这样做吗?当我尝试使用" /"进行简单替换时,我得到了这个:

fred$ for f in *_mbox; do mv "$f" "${f/_//}"; done
mv: rename TopLevel_NextLevel_mbox to TopLevel/NextLevel_mbox: No such file or directory

看起来它只是试图在" /"中进行分析,但后来因为当前没有当前文件夹TopLevel w / NextLevel_mbox而感到困惑......

谢谢, 佛瑞德

1 个答案:

答案 0 :(得分:0)

完成此工作的基础知识从从包含*mbox的当前目录创建数组的过程开始。然后,每个数组键包含在下划线之间找到的结果分隔词:

TopLevel_NextLevel_mbox

转换成这样的数组:

( TopLevel, NextLevel, mbox )

从那里我们创建第一个目录TopLevel,然后在下一个键上执行cd后跟mkdir - 重复该过程直到没有其他键。通过这样做,每个数组键创建一个新的嵌套目录(作为奖励,它还将原始目录中的任何数据复制到新目录中,同时保持其结构)。

从原始

创建嵌套文件夹
#!/bin/bash

DIR=$PWD
for f in *mbox
    do cd $DIR         
    if [[ -d $f ]]; then
        ARR=(${f//_/ }); n=0
        for i in "${ARR[@]}"   
            do echo $n
                if [[ $n -eq 0 ]]; then 
                    mkdir -p $i && cp -R $f/* $i && cd $_
                else
                    mkdir -p $i && cd $_
                fi
            let n++
        done
    fi
done

Pseudo One-liner

DIR=$PWD; for f in *mbox; do cd $DIR; if [[ -d $f ]]; then ARR=(${f//_/ }); n=0; for i in "${ARR[@]}"; do if [[ $n -eq 0 ]]; then mkdir -p $i && cp -R $f/* $i && cd $_; else mkdir -p $i && cd $_; fi; let n++; done; fi; done

这与上面的脚本完全相同,但是,它的格式为一行。 *脚本保留原始目录(我将把它们移除到OP上)。