如果文件路径可以存在或不存在,如何在bash脚本中创建文件夹结构和文件?
运行我的脚本示例(脚本名称和文件路径作为参数传递):
./someTask.sh /folder/structure/file.html
我尝试了mkdir,但它也创建了一个名为file.html的文件夹。任何帮助将不胜感激。
答案 0 :(得分:2)
这是一个仍然很短的解决方案,但不应该导致根目录中的相关文件或文件出现问题。
crfile()
{
[[ ! -e $1 ]] && mkdir -p -- "$1" && rmdir -- "$1" && touch -- "$1"
}
解释:
-p
选项创建整个结构首先将所需目标创建为目录,然后将其删除并创建为文件,不再存在父子目录路径(从未提取)或具有相对路径的特殊情况。
答案 1 :(得分:2)
做(不是太喜欢)但很简单:
crfile() {
dir=$(dirname "$1")
mkdir -p "$dir" && touch "$1"
}
while read -r path; do
crfile "$path"
done << EOF
some.txt
./some.txt
../some.txt
.././some.txt
../other/some.txt
/some.txt
/sub/some.txt
/sub/../etc/some.txt
EOF
或者如果你需要缩短
crfile() { mkdir -p "$(dirname "$1")" && touch "$1"; }
来自man mkdir
:
-p根据需要创建中间目录。如果这个选项 未指定,完整路径前缀 每个操作数必须已经存在。另一方面,如果指定了此选项,将不会出现错误 报告作为操作数给出的目录是否已存在。使用创建中间目录 由当前umask修改的rwxrwxrwx(0777)的权限位,以及写入和搜索权限 对于所有者。
使用dirname
更好,因为尝试使用参数替换来修改路径。阅读更多Bash variable substitution vs dirname and basename
是的,如果您愿意,可以添加--
- 如果您期望以-
开头的文件或目录...
答案 2 :(得分:0)
作为dirname的替代,你也可以使用参数替换:
Task.FromResult()