Unix - 创建文件夹和文件的路径

时间:2012-02-26 12:11:24

标签: linux bash shell unix scripting

我知道你可以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

有没有人想出一个函数作为解决方法呢?

11 个答案:

答案 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