首先,这个问题纯粹是理论上的;它涉及创建一个带换行符的目录,这是不应该做的事情。
那就是说,我试图使用mkdir -pv
输出在我的脚本的特定时刻删除创建的目录,但只删除新创建的目录,而不是之前存在的目录。
命令mkdir -pv
将在此命令调用之前为每个目录打印一行,以便我可以在rm -rf
命令中重新注入。它工作正常,除非目录包含换行符,我无法看到它有什么问题。
我的最小工作示例:
declare -a created
# Delete previous traces
mkdir_out=$(mkdir -pv 'new 10'{1,2,3,$'\n',"'a",4})
# Convert to array
IFS=$'\n' read -d '' -a created < <(printf '%s' "${mkdir_out}")
# Debug
printf '=>[1] %s\n' "${created[@]}"
# We only want content between first and last quote
created=( "${created[@]%[\'\"]}" )
created=( "${created[@]#*[\'\"]}" )
# Debug
printf '=>[2] %s\n' "${created[@]}"
rm -rfv "${created[@]}"
ls # Directory "new 10\n" is still there!!
那么,这样做的安全方法是什么?
答案 0 :(得分:3)
像mkdir: created directory 'foo'
这样的输出仅适用于人类。不要试图解析它。
如果您想处理所有可能的文件名而无法处理\0
分隔列表,则必须逐个处理。这是一个例子:
declare -a created dirs
dirs=( 'new 10'{1,2,3,$'\n',"'a",4} )
created=()
for dir in "${dirs[@]}"
do
if [[ ! -d "$dir" ]] && mkdir -p "$dir"
then
created+=( "$dir" )
fi
done
rm -rfv "${created[@]}"
ls # Directory "new 10\n" is not there.