如果有目录结构,可以根据记录日期存储记录。最初有一个目录,其中包含每天的子目录,如下所示
- 基目录
- 2010-01-01
- 多个文件,有时是子目录
- 2010-01-02
- ...
- ...
- 2014-12-15
- 2010-01-01
由于这个尺寸太大,让我不舒服,我决定移动一下,最后得到了这个:
- 基目录
- 2010
- 01
- 2010-01-01
- 2010-01-02
- ...
- 2010-01-31
- 02
- 2010-02-01
- 2010-02-02
- ...
- 2010-02-28
- 03
- ...
- 01
- 2011
- ...
- 2014
- 2010
因此,为了获得今天的数据,我会查看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 上运行。它被称为参数扩展中的搜索和替换。