【问题标题】:Mac OS X Terminal batch rename...but with folder pathsMac OS X 终端批量重命名...但带有文件夹路径
【发布时间】:2015-09-13 18:33:56
【问题描述】:

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

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 而感到困惑......

谢谢, 弗雷德

【问题讨论】:

  • 嗨 Fred,这是另一种情况,并不是真正的编程问题。您不仅要替换文本,还要根据需要创建目录。我建议为此编写一个脚本,替换名称,然后将原始文件移动到新名称(并搜索“mv create directory if not exist”)。如果您对即时编程问题有更具体的问题,一旦您开始,请在此处发布;-)
  • 非常感谢您的回复,西迪尔!如果可以的话,我会把头撞在墙上一点,然后用更多的细节回喊。 -Thx,金融时报
  • 对不起,我不能更具体,它不被网站的规则所接受。因为这里仅用于编程问题。我建议为这些东西尝试超级用户姐妹网站。但是指出一些你所做的事情几乎是正确的。正确完成文本转换后,this question 将为您提供帮助。
  • @fhturner,在您的层次结构中,需要像这样嵌套的文件夹:TopLevel > NextLevel > mbox & FinalLevel > mbox 或诸如 TopLevel > NextLevel > mbox > TopLevel > NextLevel > FinalLevel > mbox 之类的东西——有点不清楚。
  • 是的,Sidyll,就 Stack Overflow 而言,这里显然是一个 n00b。有时,当一个人在第一次体验中的主要目标是问一个问题时,要理解完成事情的确切方式(即使在阅读常见问题解答时)有点不知所措。 :-)

标签: macos batch-file


【解决方案1】:

这项工作的基础是从包含*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)。

【讨论】:

    猜你喜欢
    • 2020-03-14
    • 2018-10-19
    • 2012-05-26
    • 1970-01-01
    • 2021-07-23
    • 2015-03-13
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    相关资源
    最近更新 更多