如果在没有多个mkdir的脚本中不存在子文件和文件,如何创建?

时间:2015-04-17 18:30:00

标签: shell logging

在shell脚本中创建子文件夹的更好方法是什么?而不是使用以下方法?

mkdir /var/log mkdir /var/log/celery mkdir /var/log/celery/stdout mkdir /var/log/celery/stderr touch /var/log/celery/stdout/stdout.log <<< I'm hoping the use this path create folder if doesn't exists.... touch /var/log/celery/stderr/stderr.log

3 个答案:

答案 0 :(得分:2)

mkdir有一个-p标志,用于创建父目录,但touch不会创建不存在的目录。

仍然将上述内容减少到:

mkdir -p /var/log/celery/stdout /var/log/celery/stderr
touch /var/log/celery/stdout/stdout.log /var/log/celery/stderr/stderr.log

在支持大括号扩展的shell中,甚至可能是:

mkdir -p /var/log/celery/{stdout,stderr}
touch /var/log/celery/{stdout/stdout.log,stderr/stderr.log}

实际上,如果你有大括号扩展而不是mkdir -p,你可以这样做:

mkdir /var/log{,/celery{,/{stdout,stderr}}}
touch /var/log/celery/{stdout/stdout.log,stderr/stderr.log}

但是,没有任何方法可以将mkdirtouch步骤与我所知道的标准工具结合起来。

答案 1 :(得分:1)

-p的{​​{1}}选项会创建路径的中间文件夹(如果它们不存在)(当然,如果您有相应的权限):

mkdir

要创建文件,您可以在运算符mkdir -p /var/log/celery/stderr 之后附加touch,因此只有在目录成功创建或已存在的情况下才会触摸操作:

&&

(基本上,mkdir -p /var/log/celery/stderr && touch "$_/stderr.log" 会将dir路径传递给$_命令)

答案 2 :(得分:0)

UNTESTED:

 $ needir () { mkdir -p $1; echo $1; }

 $ touch $(needir /var/log/celery/stderr)/stderr.log

并将&#34; needir&#34;在您的.profile中,或者更好的是,在您登录时获取的路径上的函数库中。你经常使用它会感到惊讶。