![Можно ли сделать многоуровневый каталог?](https://rvso.com/image/31667/%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%BB%D0%B8%20%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C%20%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B5%D0%B2%D1%8B%D0%B9%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%3F%20.png)
Используя mkdir()
(функцию C), я могу создать одноуровневый каталог, если я хочу создать многоуровневый каталог, например:
folder/subfolder/subsubfolder
возможно ли это? если да, то как?
решение1
mkdir --parents folder/subfolder/subsubfolder
mkdir -p folder/subfolder/subsubfolder
решение2
mkdir -p /dir1/dir2/dir3
Подробности смотрите на странице руководства:
man mkdir
решение3
Что-то вроде этого:
#include <libgen.h>
// safe
void mkdir_recursive(const char *path)
{
char *subpath, *fullpath;
fullpath = strdup(path);
subpath = dirname(fullpath);
if (strlen(subpath) > 1)
mkdir_recursive(subpath);
mkdir(path);
free(fullpath);
}
или:
#include <string.h>
// only pass a path starting with a trailing slash
// (if path starts with a dot, it will loop and crash)
void mkdir_recursive(const char *path)
{
char *subpath, *fullpath;
fullpath = strdup(path);
subpath = basename(fullpath);
if (strlen(subpath) > 0)
mkdir_recursive(subpath);
mkdir(path);
free(fullpath);
}
Первый способ должен работать всегда. Второй способ должен работать только если ваш путь начинается с завершающего слеша, потому что он будет зацикливаться на путях, начинающихся с точки.
решение4
В случае -p
отсутствия аргументов списки аргументов обычно анализируются в том порядке, в котором они указаны в командной строке, например:
mkdir adam adam/bertil adam/bertil/caesar
функционально эквивалентно
mkdir -p adam/bertil/caesar