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


19

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

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

Ответы:


23

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
    

я могу отредактировать оригинальную touch команду и добавить -pк ней переключатель ?
MA Heshmat Khah

3
@HeshmatKhah Это должно быть возможно, но не рекомендуется дублировать исполняемые файлы системы с помощью собственных сценариев или функций. Вы можете использовать имя touch-p(без пробела!) Вместо touch2, если вы предпочитаете «p», но я не буду пытаться заменить исходную команду.
Byte Commander

1
Заметьте, что вы можете использовать удаление суффиксов вместо того dirname, чтобы делать то mkdir -p "${1%/}" && touch "$1"же самое, что и askubuntu.com/a/928544/295286
Сергей Колодяжный

7

Можно использовать 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

При таком подходе новый файл получает права на выполнение по умолчанию. Чтобы дать ему те же разрешения, которые он получал бы при прикосновении, можно использоватьinstall -m 644 -D /dev/null <filepath>
ricab

1

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.