这是我的目录结构,我想仅根据其前两个目录名称重命名指定目录 rev 下的 .html 文件。我如何使用命令来执行此操作?
prj3
|-- blk1
| |-- blk1.config
| |-- blk1.html
| |-- checklist13
| | |-- checklist13.config
| | |-- checklist13.html
| | |-- checklist13.html~
| | `-- rev2
| | |-- rev2.config
| | `-- rev2.html
| |-- checklist14
| | |-- checklist14.config
| | |-- checklist14.html
| | |-- checklist14.html~
| | `-- rev5
| | |-- rev5.config
| | |-- rev5.html
| | `-- rev5.html~
预期输出:
prj3
|-- blk1
| |-- blk1.config
| |-- blk1.html
| |-- checklist13
| | |-- checklist13.config
| | |-- checklist13.html
| | |-- checklist13.html~
| | `-- rev2
| | |-- rev2.config
| | `--checklist_13_rev2.html
| |-- checklist14
| | |-- checklist14.config
| | |-- checklist14.html
| | |-- checklist14.html~
| | `-- rev5
| | |-- rev5.config
| | |-- checklist_14_rev5.html
| | `-- rev5.html~
仅在 rev* 文件夹内的所有 rev*.html 文件应该发生相同的预期输出。
答案1
find
这是一个使用、basename
和组合的单行代码dirname
:
find . -regex '.*/rev[0-9]+/rev[0-9]+.html' -exec sh -c 'mv -iv {} $(dirname {})/$(basename $(dirname $(dirname {})))_$(basename $(dirname {})).html' \;
它基本上使用 find regex 来获取以 rev#/rev#.html 结尾的路径,并使用组合构造新名称dirname
并basename
提取父目录和父目录的父目录的名称。