我尝试错误地将我的问题添加到一个非常类似的线程中,这里有很好的解决方案:
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而感到困惑......
谢谢, 佛瑞德
答案 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
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上)。