Cria o arquivo e seu diretório pai

10

Eu sei que o comando touch cria um arquivo:

touch test1.txt

mas como posso criar um arquivo e seu caminho completo?

por exemplo, minha área de trabalho não contém nada:

~/Desktop/$ ls
~/Desktop/$

e quero criar 1.txt em ~/Desktop/a/b/c/d/e/f/g/h/1.txt . Posso fazer isso com um simples comando como:

$ touch ~/Desktop/a/b/c/d/e/f/g/h/1.txt

em vez de criar o caminho completo manualmente e depois criar o arquivo?

    
por M.A. Heshmat Khah 20.07.2016 / 14:00

3 respostas

12

touch não é capaz de criar diretórios, você precisa de mkdir para isso.

No entanto, mkdir tem a útil opção -p / --parents , que cria uma estrutura de diretório completa.

De man mkdir :

   -p, --parents
          no error if existing, make parent directories as needed

Assim, o comando que você precisa em sua situação específica é:

mkdir -p ~/Desktop/a/b/c/d/e/f/g/h/ && touch ~/Desktop/a/b/c/d/e/f/g/h/1.txt

Se você acha que precisará disso com mais frequência e não quiser digitar o caminho duas vezes toda vez, também pode criar uma função Bash ou um script para ela.

  • Função Bash (anexe esta linha a ~/.bashrc para que ela fique disponível para seu usuário, caso contrário, ela desaparecerá novamente quando você sair do seu terminal):

    touch2() { mkdir -p "$(dirname "")" && touch "" ; }
    

    Pode ser usado simplesmente assim:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
  • Script Bash (armazene em /usr/local/bin/touch2 usando sudo para disponibilizá-lo para todos os usuários, senão em ~/bin/touch2 apenas para seu usuário):

    #!/bin/bash
    mkdir -p "$(dirname "")" &&
        touch ""
    

    Não se esqueça de tornar o script executável usando chmod +x /PATH/TO/touch2 .

    Depois disso, você também pode executá-lo assim:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
por Byte Commander 20.07.2016 / 14:07
2

Pode-se usar o comando install com -D flag.

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$ 

Se tivermos vários arquivos, poderemos considerar o uso de uma lista de itens (observe, lembre-se de citar itens com espaços) e iterar sobre eles:

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

Ou alternativamente com array:

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
    
por Sergiy Kolodyazhnyy 23.06.2017 / 21:22
0

Para isso você pode criar sua própria função, exemplo abaixo:

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

Primeiro, inserimos uma função no final do arquivo ~ / .bashrc usando o comando echo. O sinalizador -p na função permite criar as pastas aninhadas, como fldr2 do nosso exemplo. Finalmente, atualizamos o arquivo com o comando source e, eventualmente, executamos o comando mkfile criado recentemente

    
por Alex P 15.04.2018 / 10:10