当名称包含“/”和“'”时创建文件夹

Cas*_*Cas 1 command-line bash scripts sed

mkdir我正在根据变量构建文件路径(并对其进行处理):

mkdir "$root_folder/$title ($year)"
Run Code Online (Sandbox Code Playgroud)

我遇到了 $title 为 的情况9/11: Inside the President's War Room。这/是一个问题,因为 mkdir 会将其解释为文件夹路径。所以我想将 all 替换/\/,以便 mkdir 从字面上理解它,而不是认为它是一条路径。名称中'的 也带来了问题。所以我也想全部替换'\'但这比我想象的要难。

/我的最终目标是按照字面解释这些文件夹的方式制作文件夹'。我已经尝试过的一些事情:

title=$(echo "$title" | sed -e "s|'|$(echo "\\")\'|g")
${title/\//\\/}
#---
title=$(echo "$title" | sed -e "s|'|$(echo "\\")\'|g" -e "s|/|\\/|g")
$title
#---
mkdir "$root_folder/'$title ($year)'"
Run Code Online (Sandbox Code Playgroud)

gle*_*man 10

只要始终正确引用变量,单引号或双引号就不会导致任何问题。

$ title=$(cat << END_TITLE
This "is a title" with 'two kinds of quotes'
END_TITLE
)

$ declare -p title
declare -- title="This \"is a title\" with 'two kinds of quotes'"

$ mkdir "$title"      # no need to try to force extra quotes in here

$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

文件名可能不包含/字符,无论您如何努力转义它。斜杠是目录分隔符。你必须替换一个不同的角色。假设您选择-

mkdir "$root_folder/${title//\//-} ($year)"
Run Code Online (Sandbox Code Playgroud)

它使用 bash 的Shell 参数扩展而不是调用 sed。