2017-04-15 73 views
0

给定一个可以存在或不存在的文件路径,如何在bash脚本中创建文件夹结构和文件?如何为给定路径创建文件夹结构和文件

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

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

我已经试过的mkdir但它创建一个名为file.html过的文件夹。任何帮助将非常感激。

+1

将使用mkdir只有在目录结构,而不是文件名通过?然后只需触摸文件。 – 123

+1

您也可以使用install命令'install -Dm644/dev/null/folder/structure/file.html' – 123

回答

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 

,或者如果你需要从man mkdir缩短

crfile() { mkdir -p "$(dirname "$1")" && touch "$1"; } 

-p创建中间目录,需要。如果未指定此选项 ,则每个操作数的完整路径前缀 必须已经存在。另一方面,如果指定了这个选项,如果作为操作数给出的目录已经存在,则报告 没有错误。中间目录通过当前umask修改的rwxrwxrwx(0777)的 权限位以及所有者的写入和搜索权限 创建。

使用dirname比使用参数替换尝试修改路径要好得多。阅读更多Bash variable substitution vs dirname and basename

是的,如果你愿意,可以添加-- - 如果你期望文件或目录以-开头,这是很好的...

2

这是一个仍然非常短的解决方案,但不应导致根目录中的相关文件或文件出现问题。

crfile() 
{ 
    [[ ! -e $1 ]] && mkdir -p -- "$1" && rmdir -- "$1" && touch -- "$1" 
} 

说明:

  • 如果现有的(任何类型)的文件,不要继续。
  • 创建一个目录第一,与-p选项来创建整个结构
  • 如果目录的创建没有成功,不要继续
  • 如果目录创建成功,然后删除刚刚创建的目录(这将是空),如果因为任何原因删除失败,则不要继续。
  • 如果一切成功,请触摸路径以创建文件。

通过首先创建所需的目标作为目录,然后将其删除并创建为文件,父目录路径(永不提取)或相对路径不再有特殊情况。

+1

是的,这是最简单的解决方案,如果不想使用'dirname'也不会在特殊情况下发疯'$ {1%/ *}'。注意一下真正的偏执狂:如果你希望这个函数能够工作,即使路径名以短划线开始,在'“$ 1”之前加一个'--'到'mkdir','rmdir'和'touch'' 。 – Dario

+0

@Dario很好的建议,我修改了答案。 – Fred

+0

谢谢@Fred,解决方案完美运作。为了简单起见,我使用dirname。让我知道如果我的选择有其他缺点。 – popcoder

0

提供替换DIRNAME你也可以使用参数替换:

mkdir -p "${1%/*}" && touch "$1" 
+2

_Mostly_将起作用。 :)和'/ some.txt'? :)或简单的'some.txt'(没有任何目录?) – jm666

+0

@ jm666 - 公平点:) – grail

相关问题