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}
再次,完全可以用echo
testing:
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