Unix – 创build文件夹和文件的path

我知道你可以做mkdir来创build一个目录然后touch来创build一个文件,但是没有办法一次完成两个操作吗?

即如果我想要做下面的文件夹other不存在:

 cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt 

错误:

 cp: cannot create regular file `/my/other/path/here/cpedthing.txt': No such file or directory 

有没有人想出一个函数作为解决这个问题的方法?

使用&&在一个shell行中组合两个命令:

 COMMAND1 && COMMAND2 mkdir -p /my/other/path/here/ && touch /my/other/path/here/cpedthing.txt 

注:以前我推荐使用; 分开这两个命令,但如同@trysis指出的那样,在大多数情况下使用&&可能更好,因为在COMMAND1失败的情况下COMMAND2也不会被执行。 (否则这可能会导致您可能没有预料到的问题。)

您需要首先创build所有的父目录。

 FILE=./base/data/sounds/effects/camera_click.ogg mkdir -p "$(dirname "$FILE")" && touch "$FILE" 

如果你想创造性,你可以做一个function :

 mktouch() { if [ $# -lt 1 ]; then echo "Missing argument"; return 1; fi for f in "$@"; do mkdir -p -- "$(dirname -- "$f")" touch -- "$f" done } 

然后像使用其他命令一样使用它:

 mktouch ./base/data/sounds/effects/camera_click.ogg ./some/other/file 
 #!/bin/sh for f in "$@"; do mkdir -p "$(dirname "$f")"; done touch "$@" 

你可以分两步进行:

 mkdir -p /my/other/path/here/ touch /my/other/path/here/cpedthing.txt 

用/ usr / bin / install来做:

 install -D /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt 

当你没有源文件时:

 install -D <(echo 1) /my/other/path/here/cpedthing.txt 
 if [ ! -d /my/other ] then mkdir /my/other/path/here cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt fi 

没有必要if then陈述…你可以在一个单一的线使用它;

 mkdir -p /my/other/path/here;cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt 

– 或两行 –

 mkdir -p /my/other/path/here cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt 

-p防止错误返回,如果目录已经存在(这是我来这里寻找:))

在特殊的(但并不罕见)的情况下,你正在尝试重新创build相同的目录层次结构, cp --parents可能是有用的。

例如,如果/my/long包含源文件,并且my/other已经存在,则可以这样做:

 cd /my/long cp --parents path/here/thing.txt /my/other 

这是我会做的:

mkdir -p /my/other/path/here && touch $_/cpredthing.txt

这里, $_是一个variables,表示我们在前面执行的命令的最后一个参数。

和往常一样,如果你想查看输出结果,你可以使用echo命令来testing它,如下所示:

echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txt

其输出为:

 mkdir -p /code/temp/other/path/here touch /code/temp/other/path/here/cpredthing.txt 

作为奖励,您可以使用括号扩展一次写入多个文件,例如:

 mkdir -p /code/temp/other/path/here && touch $_/{cpredthing.txt,anotherfile,somescript.sh} 

再次,完全可以用echotesting:

 mkdir -p /code/temp/other/path/here touch /code/temp/other/path/here/cpredthing.txt /code/temp/other/path/here/anotherfile /code/temp/other/path/here/somescript.sh 

正如我在一个unix论坛上看到和testing,这解决了这个问题

 ptouch() { for p in "$@"; do _dir="$(dirname -- "$p")" [ -d "$_dir" ] || mkdir -p -- "$_dir" touch -- "$p" done } 

如果你想简单只有1个参数片段:

 rm -rf /abs/path/to/file; #prevent cases when old file was a folder mkdir -p /abs/path/to/file; #make it fist as a dir rm -rf /abs/path/to/file; #remove the leaf of the dir preserving parents touch /abs/path/to/file; #create the actual file