Как сделать строку каталогов одной командой?
С mkdir
Команда, если я хочу, чтобы это местоположение существовало ~/test/panda/fat
когда только ~
часть этого существует до сих пор, я должен сделать что-то вроде этого:
mkdir ~/test
mkdir ~/test/panda
mkdir ~/test/panda/fat
Хотя было бы гораздо полезнее, если бы я мог запустить что-то вроде mkdir ~/test/panda/fat
и вместо того, чтобы просто получить эту ошибку:
mkdir: cannot create directory ‘/home/$USER/test/panda/fat’: No such file or directory
На самом деле это создать каталог test
в ~
тогда каталог panda
в ~/test
и, наконец, каталог fat
в этом подкаталоге. Я что-то пропустил? Есть ли способ сделать это, поскольку это было бы очень полезно? Что в действительности может быть даже более полезным в определенных ситуациях, так это для меня также возможность автоматически создавать файл в конце, чтобы он создавал все эти каталоги, а затем файл bamboo.txt
в fat
и для того, чтобы все это было в одной команде (хотя, очевидно, не требуется, чтобы в конце был файл).
Если команды, которая может это сделать, еще не существует (что, я бы удивился, если бы ее не было), то как мне создать сценарий для этого?
Я использую Ubuntu GNOME 15.10 с GNOME 3.18.
3 ответа
Использовать -p
вариант mkdir
:
mkdir -p ~/test/panda/fat
От man mkdir
:
-p, --parents
no error if existing, make parent directories as needed
Пример:
% mkdir /tmp/foo/bar
mkdir: cannot create directory ‘/tmp/foo/bar’: No such file or directory
% mkdir -p /tmp/foo/bar ## Done
Теперь о создании файла после автоматического создания несуществующих промежуточных каталогов, проще говоря - вы не можете сделать это за один раз.
Самое большее, вы можете добавить команду генерации файла после генерации директории:
mkdir -p ~/test/panda/fat && touch ~/test/panda/fat/bamboo.txt
Вы можете использовать расширение истории для touch
команда, чтобы сделать его короче или создать функцию оболочки для удобства.
Вот функция оболочки, которая сделает эту работу:
create_file_dir() {
[ "$#" -ne 2 ] && echo 'Insufficient Arguments' ||
case "$1" in -d) mkdir -p "$2" && echo "Directory '"$2"' Created" ;;
-f) mkdir -p "${2%/*}" && touch "$2" \
&& echo "File '"$2"' Created" ;;
*) echo "Invalid Argument"
esac
}
Поместите фрагмент в свой ~/.bashrc
, делать source ~/.bashrc
и использовать его как:
create_file_dir -d /directories/to/create ##For only directories
create_file_dir -f /path/to/file ## For file with intermediate dirs
Предостережение: если файл уже существует, touch
изменит метку времени.
Пример:
$ create_file_dir -d /tmp/spam/egg/
Directory '/tmp/spam/egg/' Created
$ create_file_dir -f /tmp/spam/egg/foobar
File '/tmp/foo/bar/foobar' Created
$ create_file_dir /spam/egg
Insufficient Arguments
$ create_file_dir -m /spam/egg
Invalid Argument
Попробуйте использовать -p
аргумент для создания родительских каталогов по мере необходимости.
-p, --parents
no error if existing, make parent directories as needed
И если вы не хотите использовать -p
вариант, вы можете ввести:
mkdir ~/test ~/test/panda ~/test/panda/fat