使用find、sed和mv递归移除子目录名称中的指定字符
在BSD系统递归重命名目录移除名称中的0(使用find/sed/mv)
可行的单条命令解决方案
你可以通过find结合sh -c一次性处理所有匹配的子目录,无需逐个操作。针对你的需求,完整命令如下:
find . -depth -type d -name "foobar 0*" -exec sh -c ' new_path=$(echo "$1" | sed "s/0//") mv -v "$1" "$new_path" ' _ {} \;
命令详解
find . -depth -type d -name "foobar 0*":- 递归查找当前目录下所有名称以
foobar 0开头的目录(匹配foobar 01/foobar 02等目标目录); -depth参数确保find先处理最深层的子目录,避免因父目录提前改名导致后续路径失效。
- 递归查找当前目录下所有名称以
-exec sh -c '...' _ {} \;:- 为每个找到的目录启动独立shell进程执行重命名逻辑;
{}代表当前找到的目录完整路径,_是shell脚本的$0占位符(仅满足语法要求,无实际功能)。
new_path=$(echo "$1" | sed "s/0//"):- 将原路径
$1通过sed移除单个0字符(如果需要移除名称中所有0,可改为s/0//g); - 双引号包裹变量避免路径中的空格导致参数拆分错误。
- 将原路径
mv -v "$1" "$new_path":- 执行重命名操作,
-v参数会打印每一步的重命名结果,方便确认操作正确性。
- 执行重命名操作,
安全测试建议
在执行实际重命名前,建议添加echo预览将要执行的操作,避免误改:
find . -depth -type d -name "foobar 0*" -exec sh -c ' new_path=$(echo "$1" | sed "s/0//") echo mv "$1" "$new_path" ' _ {} \;
确认输出的重命名命令符合预期后,再去掉echo执行实际操作。
内容的提问来源于stack exchange,提问作者Terry Bishop
相关产品推荐
相关产品推荐

