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

时间:2018-03-06 19:43:40

标签: bash

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

那就是说,我试图使用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!!

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

1 个答案:

答案 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.