使用嵌入了换行符的mkdir -v输出

问题描述 投票:0回答:1

首先,这个问题纯粹是理论上的;它涉及创建一个带换行符的目录,这是永远不应该做的事情。

也就是说,我正在尝试使用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!!

那么,这样做的安全方法是什么?

bash
1个回答
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.
© www.soinside.com 2019 - 2024. All rights reserved.