You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理mkdir -pv输出中含换行的目录以仅删除新创建目录?

处理含换行符目录时的mkdir/rm联动问题

先明确:绝对不建议创建包含换行符的目录,这完全是给自己挖坑的操作,以下内容纯为理论探讨。

你提到的思路——用mkdir -pv的输出来定位本次新创建的目录,再用rm -rf删除,正常场景下确实好用,因为mkdir -pv会逐行输出执行前不存在的目录路径。但碰到目录名里有换行符就歇菜了,因为换行符是默认的行分隔符,这时候mkdir的输出会把一个带换行的目录拆成多行,传给rm的时候自然就识别错了。

那怎么解决这个问题?核心是要换一种不依赖换行作为分隔符的方式来传递目录路径。这里有两个靠谱的思路:

思路1:让mkdir输出用空字符分隔路径

很多Unix/Linux命令都支持用\0(空字符)作为分隔符,因为空字符不会出现在合法的文件名/目录名里(POSIX标准规定)。不过可惜的是,标准的mkdir并没有直接输出空分隔路径的选项,但我们可以借助grep和sed来补这个缺口:

# 先创建目录,提取新创建的路径并转成空字符分隔格式存入临时文件
mkdir -pv "dir with
newline" "normal_dir" | grep -E 'created directory' | sed 's/^created directory `//;s/`$//' | tr '\n' '\0' > /tmp/new_dirs.tmp

# 用xargs读取空分隔的路径,执行删除
xargs -0 rm -rf < /tmp/new_dirs.tmp

# 清理临时文件
rm -f /tmp/new_dirs.tmp

这里的逻辑是:

  • 用grep过滤出mkdir输出里的“created directory”行
  • 用sed去掉前后的冗余文本,提取纯路径
  • 把换行符换成空字符,写入临时文件
  • 最后用xargs -0读取空分隔的路径,确保带换行的目录被完整识别

思路2:用inode对比标记新创建的目录(更稳妥)

如果不想依赖mkdir的输出格式(毕竟不同版本的mkdir输出可能有细微差别),可以换个思路:先记录当前目录的状态,创建新目录后,找出自创建后新增的目录,再删除。

# 先记录当前所有目录的inode列表(用空字符分隔)
find . -type d -print0 > /tmp/existing_dirs.tmp

# 创建目标目录
mkdir -pv "dir with
newline" "normal_dir"

# 找出新增的目录(对比inode),然后删除
find . -type d -print0 | comm -z -13 /tmp/existing_dirs.tmp - | xargs -0 rm -rf

# 清理临时文件
rm -f /tmp/existing_dirs.tmp

这个方法更可靠,因为它不依赖mkdir的输出,而是通过对比目录的inode来判断哪些是新创建的,完全避开了文件名里的特殊字符问题。

最后再强调一遍:生产环境绝对不要创建带换行符或其他特殊字符的目录,这种操作会让后续的脚本、工具(比如ls、cp、rsync)都出现各种奇怪的问题,维护成本极高。

内容的提问来源于stack exchange,提问作者eugenioperez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:49:23