Unix - создайте путь к папкам и файлу

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

Кто-нибудь придумал функцию для решения этой проблемы?

105 голосов | спросил toop 26 FebruaryEurope/MoscowbSun, 26 Feb 2012 16:11:23 +0400000000pmSun, 26 Feb 2012 16:11:23 +040012 2012, 16:11:23

10 ответов


0

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

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

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

ответил evotopid 26 FebruaryEurope/MoscowbSun, 26 Feb 2012 16:15:31 +0400000000pmSun, 26 Feb 2012 16:15:31 +040012 2012, 16:15:31
0

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

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 "[email protected]"; do
        mkdir -p -- "$(dirname -- "$f")"
        touch -- "$f"
    done
}

А затем используйте его как любую другую команду:

mktouch ./base/data/sounds/effects/camera_click.ogg ./some/other/file
ответил Jonathon Reinhart 10 +04002013-10-10T10:45:24+04:00312013bEurope/MoscowThu, 10 Oct 2013 10:45:24 +0400 2013, 10:45:24
0

Сделайте это с /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
ответил Ivan Dives 4 AM000000100000000231 2016, 10:44:02
0
#!/bin/sh
for f in "[email protected]"; do mkdir -p "$(dirname "$f")"; done
touch "[email protected]"
ответил Javier 26 FebruaryEurope/MoscowbSun, 26 Feb 2012 16:14:38 +0400000000pmSun, 26 Feb 2012 16:14:38 +040012 2012, 16:14:38
0

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

mkdir -p /my/other/path/here/
touch /my/other/path/here/cpedthing.txt
ответил Jörg Beyer 26 FebruaryEurope/MoscowbSun, 26 Feb 2012 16:13:49 +0400000000pmSun, 26 Feb 2012 16:13:49 +040012 2012, 16:13:49
0
if [ ! -d /my/other ]
then
   mkdir /my/other/path/here
   cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
fi
ответил Barun Parichha 29 FebruaryEurope/MoscowbWed, 29 Feb 2012 13:06:04 +0400000000pmWed, 29 Feb 2012 13:06:04 +040012 2012, 13:06:04
0

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

ptouch() {
    for p in "[email protected]"; do
        _dir="$(dirname -- "$p")"
        [ -d "$_dir" ] || mkdir -p -- "$_dir"
    touch -- "$p"
    done
}
ответил Fabian Rios 1 J0000006Europe/Moscow 2016, 14:37:26
0

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

ответил tediffer3rd 30 Mayam13 2013, 06:51:49
0

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

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

cd /my/long
cp --parents path/here/thing.txt /my/other
ответил Todd Owen 5 ThuEurope/Moscow2013-12-05T12:40:05+04:00Europe/Moscow12bEurope/MoscowThu, 05 Dec 2013 12:40:05 +0400 2013, 12:40:05
0

если вы хотите простой, используя только один фрагмент кода:

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
ответил stranger 23 Jpm1000000pmThu, 23 Jan 2014 15:24:12 +040014 2014, 15:24:12

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132