如何为给定路径创建文件夹结构和文件

时间:2017-04-15 11:39:20

标签: linux bash shell scripting

如果文件路径可以存在或不存在,如何在bash脚本中创建文件夹结构和文件?

运行我的脚本示例(脚本名称和文件路径作为参数传递):

./someTask.sh /folder/structure/file.html

我尝试了mkdir,但它也创建了一个名为file.html的文件夹。任何帮助将不胜感激。

3 个答案:

答案 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()