Unix - создайте путь к папкам и файлу - PullRequest
115 голосов
/ 26 февраля 2012

Я знаю, что вы можете сделать 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 ]

126 голосов
/ 26 февраля 2012

Используйте && для объединения двух команд в одной строке оболочки:

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

Примечание. Ранее я рекомендовал использовать ; для разделения двух команд, но, как указывает @trysis, вероятно, лучшеиспользовать && в большинстве ситуаций, потому что в случае сбоя COMMAND1 1008 * также не будет выполняться.(В противном случае это может привести к проблемам, которых вы, возможно, не ожидали.)

73 голосов
/ 10 октября 2013

Сначала нужно создать все родительские каталоги.

FILE=./base/data/sounds/effects/camera_click.ogg

mkdir -p "$(dirname "$FILE")" && touch "$FILE"

Если вы хотите проявить творческий подход, вы можете сделать функцию :

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
19 голосов
/ 04 августа 2016

Сделайте это с / 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
12 голосов
/ 26 февраля 2012
#!/bin/sh
for f in "$@"; do mkdir -p "$(dirname "$f")"; done
touch "$@"
12 голосов
/ 26 февраля 2012

вы можете сделать это в два этапа:

mkdir -p /my/other/path/here/
touch /my/other/path/here/cpedthing.txt
11 голосов
/ 20 августа 2017

Вот что я бы сделал:

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
2 голосов
/ 01 июня 2016

как я видел и тестировал на форуме Unix, это решает проблему

ptouch() {
    for p in "$@"; do
        _dir="$(dirname -- "$p")"
        [ -d "$_dir" ] || mkdir -p -- "$_dir"
    touch -- "$p"
    done
}
2 голосов
/ 29 февраля 2012
if [ ! -d /my/other ]
then
   mkdir /my/other/path/here
   cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
fi
1 голос
/ 05 декабря 2013

В особом (но не редком) случае, когда вы пытаетесь воссоздать ту же иерархию каталогов, cp --parents может быть полезным.

Например, если /my/long содержит исходные файлы и my/other уже существует, вы можете сделать это:

cd /my/long
cp --parents path/here/thing.txt /my/other
1 голос
/ 30 мая 2013

нет необходимости в 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 предотвращает возврат ошибок, если каталог уже существует (что я и искал здесь:))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...