- How to Use the Recursive Linux Make Directory Command
- Method 1: Using the Parent mkdir Option
- Method 2: Using the Parent mkdir Option Plus Brace Expansion
- Mkdir Recursive
- Creating Directories Using mkdir
- Creating Directories Recursively
- Creating Multiple Child Directories With Brace Expansion
- Final Thoughts
- Как использовать рекурсивную команду создания каталога в Linux
- Метод 1. Использование родительского параметра mkdir
- Метод 2: Использование родительского параметра mkdir с расширением скобок
- recursive mkdir
- 4 Answers 4
How to Use the Recursive Linux Make Directory Command
Generally, when you use the mkdir Linux make directory command you create a single subdirectory that lives in whatever directory your prompt is currently sitting in. If you were in ~/Documents and you typed mkdir Memoranda, then you’d create a single directory called Memoranda that lived in ~/Documents. You don’t usually create more directories inside of it.
However, you can use the recursive form of the Linux make directory command to create entire directory trees. You can create a directory inside the directory that you’re sitting in and then make many other directories inside of that. Naturally, you’ll need to be working from a CLI prompt to continue. Hold down Ctrl, Alt and T to open a graphical terminal. You could also search for Terminal on the Ubuntu Unity Dash or select the Applications menu, click on System Tools and select Terminal. You won’t have to be working as a root user if you’re not making directories outside of your own home directory.
Method 1: Using the Parent mkdir Option
If you wanted to make a number of directories all at once, then you could type mkdir -p hey/this/is/a/whole/tree and then push enter. You’d get an entire set of directories with each of those names, all nested inside of each other. Obviously, you could use whichever name you’d like at any point in the tree. If some of those directories exist, say there already is hey and this but not the others, then mkdir will simply pass these over without error and make directories underneath them.
The -p option is called parents, and could theoretically be invoked in many distributions by typing –parents instead of -p in the previous command. You can create a practically unlimited number of directories in this fashion all at once. As soon as they’re created, they function completely like any other directories. This means that if you try to remove the top one, it will complain about not being empty too!
Method 2: Using the Parent mkdir Option Plus Brace Expansion
Brace expansion allows you to create a bunch of directories that follow a single pattern when using the bash command interpreter. For instance, if you typed mkdir , then you will have created four directories numbered as such in the current directory. If you wanted to, then you could combine this concept with the parent option. You could, for instance, type mkdir -p 1/ and push enter to create a directory called 1 with directories called 1, 2, 3 and 4 inside of it. It’s a very powerful command, and you can use it to create tons of directories all at once. This makes it perfect for sorting collections of photos, videos and music in Linux. Some people also use this technology when creating install scripts for software or packages they plan to distribute.
You can of course mix this option in and add brace expansion to any part of the command. If you wanted to create some directories via brace expansion, and then others via only parents recursion, then you might want to try a command like mkdir -p a/directory/inside , which will create a and directory inside of a as well as inside1, inside2, inside3 and inside4 underneath it. Feel free to experiment a bit and create extra directories inside of each other once you’ve already learned how to use the mkdir command, but keep in mind that you won’t be able to remove directories that have other directories inside them without a little recursion or the use of a file manager.
Mkdir Recursive
“In Linux, mkdir is a dedicated command for creating new directories. By default, the command creates one-level directories. However, with some additional flags, it can create multi-level directories. The mkdir command also allows you to set permissions for the directories.”
In this guide, we will look at using mkdir to create directories recursively.
Creating Directories Using mkdir
First, let’s look at the most basic way of using mkdir. The following command will create a directory with the name given:
You can verify if the action was successful:
Alternatively, we can enable the verbose mode with mkdir. This way, the mkdir command will print the action’s result. To enable the verbose mode, use the flag -v or –verbose:
We can also create multiple directories using a single mkdir command:
However, mkdir doesn’t allow creating a multi-layer directory by default. If attempted, mkdir will show an error that it can’t find the parent directory.
Creating Directories Recursively
To create a multi-layer directory, mkdir comes with the flag -p or –parents. In this mode, mkdir will return no error if the parent directory exists. If the parent directory doesn’t exist, it will create it instead.
Let’s try this option out. In the following example, we’re creating a three-layer directory:
With the help of the tree command, we can visualize the structure:
Typing the full name of the mkdir flags is a bit tedious, right? We can combine –verbose and –parents in the following manner:
Creating Multiple Child Directories With Brace Expansion
If you’re using bash, we can also take advantage of the brace-expansion feature to create multi-layered directories. Have a look at the following example:
We can use the tree command for better visualization of the directory hierarchy:
Final Thoughts
In this guide, we explored using mkdir to create directories recursively. For demonstration, we instructed mkdir to create multi-layer directories using the –parents flag. Per instruction, mkdir recursively created the child directories. Learn more about using the mkdir command.
The man page is always a great source of in-depth info and explanations:
Как использовать рекурсивную команду создания каталога в Linux
Обычно, когда вы используете команду mkdir Linux make directory, вы создаете единственный подкаталог, который находится в любом каталоге, в котором находится ваше приглашение. Если бы вы были в ~/Documents и набрали mkdir Memoranda, вы бы создайте единственный каталог под названием Memoranda, который находится в ~/Documents. Обычно внутри него не создается дополнительных каталогов.
Однако вы можете использовать рекурсивную форму команды Linux make directory для создания целых деревьев каталогов. Вы можете создать каталог внутри каталога, в котором вы находитесь, а затем создать внутри него множество других каталогов. Естественно, чтобы продолжить, вам нужно будет работать из командной строки. Удерживайте Ctrl, Alt и T, чтобы открыть графический терминал. Вы также можете выполнить поиск терминала в Ubuntu Unity Dash или выбрать меню «Приложения», нажать «Системные инструменты» и выбрать «Терминал». Вам не придется работать как пользователь root, если вы не создаете каталоги за пределами вашего собственного домашнего каталога.
Метод 1. Использование родительского параметра mkdir
Если вы хотите создать несколько каталогов одновременно, вы можете ввести mkdir -p hey/this/is/a/whole/tree , а затем нажмите Enter. Вы получите полный набор каталогов с каждым из этих имен, вложенных друг в друга. Очевидно, вы можете использовать любое имя в любом месте дерева. Если некоторые из этих каталогов существуют, скажем, там уже есть hey и this, но не другие, тогда mkdir просто передаст их без ошибок и создаст каталоги под ними.
Параметр -p называется родительским и теоретически может быть вызван во многих дистрибутивах, набрав –parents вместо -p в предыдущем команда. Таким образом вы можете создать практически неограниченное количество каталогов одновременно. Сразу после создания они работают как любые другие каталоги. Это означает, что если вы попытаетесь удалить верхний, он тоже будет жаловаться на то, что он не пустой!
Метод 2: Использование родительского параметра mkdir с расширением скобок
Расширение скобок позволяет вам создать группу каталогов, которые следуют единому шаблону при использовании интерпретатора команд bash. Например, если вы набрали mkdir , то вы создадите четыре каталога с соответствующими номерами в текущем каталоге. Если хотите, то можете объединить эту концепцию с родительской опцией. Например, вы можете ввести mkdir -p 1/ и нажать Enter, чтобы создать каталог с именем 1 с каталогами с именами 1, 2, 3 и 4 внутри него. Это очень мощная команда, и вы можете использовать ее для одновременного создания множества каталогов. Это делает его идеальным для сортировки коллекций фотографий, видео и музыки в Linux.. Некоторые люди также используют эту технологию при создании сценариев установки для программного обеспечения или пакетов, которые они планируют распространять.
Конечно, вы можете смешать эту опцию и добавить фигурные скобки к любой части команды. Если вы хотите создать одни каталоги с помощью фигурных скобок, а другие с помощью только родительской рекурсии, вы можете попробовать такую команду, как mkdir -pa/directory/inside , который создаст каталог и внутри, а также внутри1, внутри2, внутри3 и внутри4 под ним. Не стесняйтесь немного поэкспериментировать и создать дополнительные каталоги внутри друг друга, как только вы уже научились использовать команду mkdir, но имейте в виду, что вы не сможете удалить каталоги, в которых есть другие каталоги, без небольшого рекурсия или использование файлового менеджера.
recursive mkdir
funny, I was looking at that page but totally overlooked «parent» because I was thinking of them as children (left to right).
Personally, I overlooked «parent» in the man page as well because, well, I feel like the flag should be «-r» for «recursive» — or at the very least, there should be an alias for such since mkdir has only 6 documented flags in total. Hell, I feel like the command should create directories recursively by default, and if you don’t want this then you should have to specify so explicitly.
4 Answers 4
$ mkdir -p foo/bar/zoo/andsoforth
Parameter p stands for ‘parents’.
Using mkdir -p is a simple way for most modern OSes:
mkdir -p foo/bar/zoo/andsoforth
However, mkdir -p is not recommended in many manuals. Read documentation for of GNU make and autoconf about problems with using mkdir -p :
The cross platform installation and configuration systems have their own safe alternatives for mkdir -p .
CMake to use in shell command line:
cmake -E make_directory foo/bar/zoo/andsoforth
Autoconf to use in script with preprocessing:
AS_MKDIR_P(foo/bar/zoo/andsoforth)
AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)
But these solutions require cmake or autoconf ( M4 ) tools to be installed (and possible preprocessing)
You can use also install-sh script with -d option:
install-sh -d foo/bar/zoo/andsoforth
This script is used by autoconf and automake project. I think it must be the safest solution.
At the time I was searching for a cross platform solution for standard /bin/sh without dependences, but haven’t found one. Therefore I wrote the next script that may be not ideal, but I think it is compliant to most cross platform requirements:
#! /bin/sh cdirname() # cross platform alternative for 'dirname' < # $1 - path test $# -eq 1 || < echo "Procedure 'cdirname' must have only one parameter. Scripting error."; exit 1; >echo "$1" | sed -n -e '1p' | sed -e 's#//*#/#g' -e 's#\(.\)/$#\1#' -e 's#^[^/]*$#.#' -e 's#\(.\)/[^/]*$#\1#' - > mkd() # cross platform alternative for 'mkdir -p' < # $1 - directory to create test $# -eq 1 || < echo "Function 'mkd' can create only one directory (with it's parent directories)."; exit 1; >test -d "$1" && return 0 test -d "$(cdirname "$1")" || < mkd "$(cdirname "$1")" || return 1; >test -d "$1" || < mkdir "$1" || return 1; >return 0 >
This script can be used for old systems, where option -p for mkdir is absent.
sed -based cross platform version of dirname was added to the code. It works with a way similar to dirname (correct with path / , paths with base name only, paths with trailing / , paths with and without trailing \n s). This function can’t work correct if the path has newlines or some invalid characters for current locale. It also replaces any combination of / ( // , /// ) with single /
Changed line mkdir «$1» || return 1 to test -d «$1» || < mkdir "$1" || return 1; >because mkdir terminates with error if path exists and this check is needed for paths containing constructions like aaa\. (If aaa doesn’t exist previous version creates aaa and then tries to create it again).
This version of mkd doesn’t generate an error if path already exist (but it still has the possibility to generate such an error in parallel execution) and can’t get several directories in command line.