重命名多个目录

重命名多个目录

如果有目录结构,可以根据记录日期存储记录。最初有一个目录,其中包含每天的子目录,如下所示

  • 基目录
    • 2010-01-01
      • 多个文件,有时是子目录
    • 2010-01-02
    • ...
    • ...
    • 2014-12-15

由于这个尺寸太大,让我不舒服,我决定移动一下,最后得到了这个:

  • 基目录
    • 2010
      • 01
        • 2010-01-01
        • 2010-01-02
        • ...
        • 2010-01-31
      • 02
        • 2010-02-01
        • 2010-02-02
        • ...
        • 2010-02-28
      • 03
      • ...
    • 2011
    • ...
    • 2014

因此,为了获得今天的数据,我会查看basedir/2014/12/2014-12-15/

我想重命名所有完整日期子目录,使它们仅以月份日期作为名称。今天的数据将位于basedir/2014/12/15/

实现这一目标的简单方法是什么?


经过一番寻找之后,我创建了一个find正则表达式,它可以专门为我提供我正在寻找的目录,从而减少混乱的可能性。

find . -type d -regextype posix-extended -regex '.*/(20[0-9]{2})/(0[1-9]|1[0-2])/\1-\2-(0[1-9]|[1-2][0-9]|3[0-1])'

答案1

以下是一行代码:

find -mindepth 3 -maxdepth 3 -type d | while read -r name; do
  mv -v "$name" "${name/????-??-}"; done

在 执行basedir

换行只是为了方便阅读,但从技术上讲,它是一行代码。

我强烈建议在执行前创建备份。此命令不进行健全性检查。在任意树上执行它根本不安全。它会弄乱碰巧具有相同“日期”部分的目录。当目录名中有空格时,它会中断。

但是对于一次性运行,对于您知道文件名是合理的数据,通过备份,然后进行手动验证,一次使用就足够安全了。

"${name/????-??-}"部分是 bash 特有的。它可能无法在其他 shell 上运行。它被称为参数扩展中的搜索和替换

相关内容