通过删除目录名称的一部分来重命名目录

通过删除目录名称的一部分来重命名目录

有很多类似下面的目录

./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的数量​32xdigit
  • (#q/)q将匹配限制为文件类型的限定符目录
  • $1$2计算替换。

zmv深度优先处理文件,因此如果有dir/a-FeedADeadBeef654321BadFadedDecaf/b-11112222333344445555666677778888目录,则首先dir/a-FeedADeadBeef654321BadFadedDecaf/b-11112222333344445555666677778888重命名为,dir/a-FeedADeadBeef654321BadFadedDecaf/b然后重命名dir/a-FeedADeadBeef654321BadFadedDecafdir/a

它还首先执行所有替换,并在开始重命名之前检查冲突,以避免丢失数据。

相关内容