我知道你可以mkdir
来创建一个目录而touch
来创建一个文件,但是没有办法一次完成这两个操作吗?
即。如果我想在文件夹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
有没有人想出一个函数作为解决方法呢?
答案 0 :(得分:126)
使用&&
在一个shell行中组合两个命令:
COMMAND1 && COMMAND2
mkdir -p /my/other/path/here/ && touch /my/other/path/here/cpedthing.txt
注意:之前我建议使用;
来分隔这两个命令,但正如@trysis所指出的,在大多数情况下使用&&
可能更好,因为COMMAND1
失败{ {1}}也不会被执行。 (否则,这可能会导致您可能没有预料到的问题。)
答案 1 :(得分:73)
您需要先创建所有父目录。
FILE=./base/data/sounds/effects/camera_click.ogg
mkdir -p "$(dirname "$FILE")" && touch "$FILE"
如果您想要发挥创意,可以make a 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
答案 2 :(得分:18)
使用/ 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
答案 3 :(得分:12)
你可以分两步完成:
mkdir -p /my/other/path/here/
touch /my/other/path/here/cpedthing.txt
答案 4 :(得分:12)
#!/bin/sh
for f in "$@"; do mkdir -p "$(dirname "$f")"; done
touch "$@"
答案 5 :(得分:11)
这就是我要做的事情:
mkdir -p /my/other/path/here && touch $_/cpredthing.txt
这里,$_
是一个变量,表示我们在行执行的上一个命令的最后一个参数。
与往常一样,如果您想查看输出可能是什么,可以使用echo
命令对其进行测试,如下所示:
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
测试:
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
答案 6 :(得分:2)
if [ ! -d /my/other ]
then
mkdir /my/other/path/here
cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
fi
答案 7 :(得分:2)
当我在unix论坛中看到并测试时,这解决了问题
ptouch() {
for p in "$@"; do
_dir="$(dirname -- "$p")"
[ -d "$_dir" ] || mkdir -p -- "$_dir"
touch -- "$p"
done
}
答案 8 :(得分:1)
不需要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
可以防止错误返回(这就是我在这里寻找的地方:))
答案 9 :(得分:1)
在尝试重新创建相同目录层次结构的特殊(但并非罕见)情况下,cp --parents
可能很有用。
例如,如果/my/long
包含源文件,且my/other
已存在,则可以执行以下操作:
cd /my/long
cp --parents path/here/thing.txt /my/other
答案 10 :(得分:-4)
如果你想简单只有1个param片段:
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