有很多类似下面的目录
./parent/inventory_control-8118c470fa3811ed9add1fef7e5ef70f/snapshots/automation
./parent/configuration_data-6be54fa0fa3e11ed9add1fef7e5ef70f/snapshots/automation
./parent/zip_code-940ac1d0fa3f11ed9add1fef7e5ef70f/snapshots/automation
我想通过从目录名称中删除连字符和 uuid 来重命名目录。期望的输出是
./parent/inventory_control/snapshots/automation
./parent/configuration_data/snapshots/automation
./parent/zip_code/snapshots/automation
您能否建议使用一行命令来查找所有目录并重命名它们?或者 bash 脚本也可以提供帮助。
答案1
for f in ./parent/*; do mv "$f" "${f%%-*}"; done
(重击)
答案2
使用珀尔的rename
(可在任何操作系统中使用):
rename -n 's/-*//' ./parent/*/
或者
rename -n 's@-[[:xdigit:]]+/snapshots/@/snapshots/@' ./parent/*/snapshots/
删除-n
开关,又名试运行当你的尝试令人满意时重命名为真实的。
如果有意义的话,您可以添加 32 十六进制条件:
rename -n 's@-[[:xdigit:]]{32}/snapshots/@/snapshots/@'
答案3
使用 zsh shell:
autoload -Uz zmv
zmv -n '(**/)(?*)-[[:xdigit:]](#c32)(#q/)' '$1$2'
(-n
如果满意,请删除(试运行))
autoload
将函数标记zmv
为可自动加载这意味着第一次调用时,将从某个目录中的某个文件加载该函数的代码$fpath
。使用 时-U
,别名扩展不会在加载时完成,使用 时-z
,它会加载到zsh 模拟,即使用一组默认选项。这两种保护措施都是为了避免自定义影响该函数的行为。如果您经常使用该函数,您可能需要将该行添加到您的~/.zshrc
.zmv 'pattern' 'expression'
查找匹配的文件图案并根据结果重命名表达(**/)
:匹配目录级别并将其捕获到$1
.(?*)
:至少一个字符,在 中捕获$2
。[[:xdigit:]](#c32)
十进制sc
的数量32
x
digit
(#q/)
q
将匹配限制为文件类型的限定符目录。$1$2
计算替换。
zmv
深度优先处理文件,因此如果有dir/a-FeedADeadBeef654321BadFadedDecaf/b-11112222333344445555666677778888
目录,则首先dir/a-FeedADeadBeef654321BadFadedDecaf/b-11112222333344445555666677778888
重命名为,dir/a-FeedADeadBeef654321BadFadedDecaf/b
然后重命名dir/a-FeedADeadBeef654321BadFadedDecaf
为dir/a
。
它还首先执行所有替换,并在开始重命名之前检查冲突,以避免丢失数据。