如果需要在一行中如何触摸文件和mkdir

wal*_*ker 15 linux perl

我需要触摸一个绝对文件名的文件,例如:/opt/test/test.txt,但我不确定系统上是否存在/ opt/test.所以代码应该类似于:

if (-d '/opt/test') {
    touch '/opt/test/test.txt';
} else {
    mkdir -p '/opt/test';
    touch '/opt/test/test.txt'
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来简化代码?我希望有一些系统命令可以只用一行完成相同的工作.

Mat*_*Mat 11

在shell脚本中,您可以简单地执行以下操作:

mkdir -p /opt/test && touch /opt/test/test.txt
Run Code Online (Sandbox Code Playgroud)

mkdir -p 如果目录已存在,则不会失败(并且不会执行任何操作).

在perl中,make_pathFile::Path模块中使用,然后根据需要创建文件.make_path如果目录已存在,也不会执行任何操作,因此无需自行检查.


jm6*_*666 10

在perl中,使用我最喜欢的模块之一:Path :: Tiny.

path("/opt/test/test.txt")->touchpath;
Run Code Online (Sandbox Code Playgroud)

来自doc:

结合mkpath和touch.在触摸文件之前,如果父目录不存在,则创建父目录.


Tho*_*lls 9

我不太喜欢打字,所以我把这个命令放在我的 .profile 中的一个命名 fn 中,但在我这样做之前我使用这个公式很多年了:

mkdir -p dirname/sub/dir && touch $_/filename.ext

该变量$_存储上一个命令的最后一个参数。了解整体情况非常方便。


Sri*_*jan 7

mkdir B && touch B/myfile.txt
Run Code Online (Sandbox Code Playgroud)

或者,创建一个函数:

   mkfile() { 
    mkdir -p $( dirname "$1") && touch "$1" 
   }
Run Code Online (Sandbox Code Playgroud)

使用1个参数执行它:文件路径。说:

mkfile B/C/D/myfile.txt
Run Code Online (Sandbox Code Playgroud)

将在目录B / C / D中创建文件myfile.txt。

  • 恕我直言,最好使用一个参数(`mkfile / path / to / filename`)来调用它。脚本(或函数)可以在内部调用`dirname`。 (2认同)

AL *_*e X 6

我的文件中有这个 shell 函数.zshalias

function touch-safe {
    for f in "$@"; do
      [ -d $f:h ] || mkdir -p $f:h && command touch $f
    done
}
alias touch=touch-safe
Run Code Online (Sandbox Code Playgroud)

如果 或test命令mkdir失败,则不会touch调用任何命令。


Dal*_*son 5

touchp在我的定义了一个~/.bash_aliases

function touchp() {
  /bin/mkdir -p "$(dirname "$1")/" && /usr/bin/touch "$1"
}
Run Code Online (Sandbox Code Playgroud)

如果文件不存在,它会默默地在文件上方创建结构,并且在传递单个文件名而在其前面没有任何目录时使用是完全安全的。