Создайте файл и его родительский каталог

Я знаю это 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

вместо создают полный путь вручную и затем создают файл?

18
задан 24 June 2017 в 06:21

4 ответа

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
    
21
ответ дан 23 November 2019 в 02:09

Можно использовать 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
7
ответ дан 23 November 2019 в 02:09

С этой целью можно создать собственную функцию, пример ниже:

$ echo 'mkfile() { mkdir -p "$(dirname "$1")" && touch "$1" ;  }' >> ~/.bashrc
$ source ~/.bashrc
$ mkfile ./fldr1/fldr2/file.txt

Сначала мы вставляем функцию в конец ~/.bashrc файл с помощью команды эха. Флаг-p в функции позволяет создавать вложенные папки, такие как fldr2 от нашего примера. Наконец мы обновляем файл с исходной командой и в конечном счете выполняем недавно созданную команду mkfile

0
ответ дан 23 November 2019 в 02:09
mkdir -p parent/child && touch $_/file.txt
5
ответ дан 19 March 2020 в 05:44

Другие вопросы по тегам:

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