Я знаю это touch
команда создает файл:
touch test1.txt
но как я могу создать файл и его полный путь?
например, мой рабочий стол ничего не содержит:
~/Desktop/$ ls
~/Desktop/$
и я хочу создать 1.txt в ~/Desktop/a/b/c/d/e/f/g/h/1.txt
. Могу я делать это с простой командой как:
$ touch ~/Desktop/a/b/c/d/e/f/g/h/1.txt
вместо создают полный путь вручную и затем создают файл?
touch
не может создать каталоги, Вам нужно mkdir
для этого.
Однако mkdir
имеет полезное -p
/--parents
опция, которая создает полную структуру каталогов.
От man mkdir
:
-p, --parents
no error if existing, make parent directories as needed
Таким образом, команда, в которой Вы нуждаетесь в своей определенной ситуации:
mkdir -p ~/Desktop/a/b/c/d/e/f/g/h/ && touch ~/Desktop/a/b/c/d/e/f/g/h/1.txt
Если Вы думаете, что будете нуждаться в этом чаще и не хотите вводить путь дважды каждый раз, когда можно также сделать функцию Bash или сценарий для нее.
Функция Bash (добавляют эту строку к ~/.bashrc
для персистентного имения его в наличии для пользователя иначе он исчезнет снова при выходе из терминала):
touch2() { mkdir -p "$(dirname "$1")" && touch "$1" ; }
Это может просто использоваться как это:
touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
Сценарий Bash (хранят его в /usr/local/bin/touch2
использование sudo для предоставления доступа к этому доступным для всех пользователей, еще в ~/bin/touch2
только для Вашего пользователя):
#!/bin/bash
mkdir -p "$(dirname "$1")" &&
touch "$1"
Не забывайте делать исполнимое использование сценария chmod +x /PATH/TO/touch2
.
После этого можно также выполнить его как это:
touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
Можно использовать install
команда с -D
флаг.
bash-4.3$ install -D /dev/null mydir/one/two
bash-4.3$ tree mydir
mydir
└── one
└── two
1 directory, 1 file
bash-4.3$
, Если у нас есть несколько файлов, мы могли бы хотеть рассмотреть использование списка объектов (примечание, не забудьте заключать объекты в кавычки с пробелами), и выполняющий итерации по ним:
bash-4.3$ for i in mydir/{'subdir one'/{file1,file2},'subdir 2'/{file3,file4}} ; do
> install -D /dev/null "$i"
> done
bash-4.3$ tree mydir
mydir
├── one
│ └── two
├── subdir 2
│ ├── file3
│ └── file4
└── subdir one
├── file1
└── file2
Или альтернативно с массивом:
bash-4.3$ arr=( mydir/{'subdir one'/{file1,file2},'subdir 2'/{file3,file4}} )
bash-4.3$ for i in "${arr[@]}"; do install -D /dev/null "$i"; done
bash-4.3$ tree mydir
mydir
├── one
│ └── two
├── subdir 2
│ ├── file3
│ └── file4
└── subdir one
├── file1
└── file2
С этой целью можно создать собственную функцию, пример ниже:
$ echo 'mkfile() { mkdir -p "$(dirname "$1")" && touch "$1" ; }' >> ~/.bashrc
$ source ~/.bashrc
$ mkfile ./fldr1/fldr2/file.txt
Сначала мы вставляем функцию в конец ~/.bashrc файл с помощью команды эха. Флаг-p в функции позволяет создавать вложенные папки, такие как fldr2 от нашего примера. Наконец мы обновляем файл с исходной командой и в конечном счете выполняем недавно созданную команду mkfile