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

时间:2015-02-03 10:17:32

标签: 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'
}

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

8 个答案:

答案 0 :(得分:11)

在shell脚本中,您只需执行以下操作:

mkdir -p /opt/test && touch /opt/test/test.txt
如果目录已经存在,

mkdir -p将不会失败(并且不会做任何事情)。

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

答案 1 :(得分:10)

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

path("/opt/test/test.txt")->touchpath;

来自doc:

  

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

答案 2 :(得分:6)

mkdir B && touch B/myfile.txt

或者,创建一个函数:

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

使用1个参数执行它:filepath。话说:

mkfile B/C/D/myfile.txt

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

答案 3 :(得分:4)

来自命令行的Perl,

perl -MFile::Basename -MFile::Path=make_path -e'
  make_path(dirname($_)), open(F, ">>", $_) for pop;
' /opt/test/test.txt

答案 4 :(得分:4)

我喜欢打字很少,所以我将这个命令放入我的.profile中的一个名为fn,但是在我做之前我使用了这个配方多年:

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

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

答案 5 :(得分:2)

我在touchp中定义了~/.bash_aliases

function touchp() {
  /bin/mkdir -p "$(dirname "$1")/" && /usr/bin/touch "$1"
}

如果不存在,它会默默地在文件上方创建结构,并且在传递单个文件名时使用它是完全安全的。

答案 6 :(得分:1)

我的.zshalias文件中有此shell函数:

function touch-safe {
    for f in "$@"; do
      [ -d $f:h ] || mkdir -p $f:h && command touch $f
    done
}
alias touch=touch-safe

如果testmkdir命令失败,则不会调用touch命令。

答案 7 :(得分:0)

将Python带到命令行。

即。使用pyp

 cat filepaths.txt | pyp "'mkdir -p '+s[0:-1]|s+'; touch '+o" | sh

Pyed Piper"或pyp是一个类似于awk或sed的linux命令行文本操作工具,但它使用标准的python字符串和列表方法以及自定义函数演变为在密集生产中生成快速结果环境。