Criar arquivo e seu diretório pai

19

Eu sei que o touchcomando 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 eu quero criar 1.txt em ~/Desktop/a/b/c/d/e/f/g/h/1.txt. Posso fazer isso com um comando simples 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?

MA Heshmat Khah
fonte

Respostas:

23

touchnão é capaz de criar diretórios, você precisa mkdirdisso.

No entanto, mkdirpossui a opção -p/ útil --parentsque cria uma estrutura de diretórios completa.

De man mkdir:

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

Portanto, 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 deseja digitar o caminho duas vezes todas as vezes, também pode criar uma função Bash ou um script para ele.

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

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

    Pode ser simplesmente usado assim:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
  • Script Bash (armazene-o /usr/local/bin/touch2usando o sudo para torná-lo disponível para todos os usuários, ou ~/bin/touch2apenas para o usuário):

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

    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
    
Byte Commander
fonte
posso editar o touch comando original e adicionar a opção -p?
MA Heshmat Khah
3
@HeshmatKhah Deve ser possível, mas não é recomendável ocultar os executáveis ​​do sistema com seus próprios scripts ou funções. Você poderia usar o nome touch-p(sem espaço!) Em vez de touch2, se preferir o "p", mas eu não tentaria substituir o comando original.
Byte Commander
1
Note que você pode usar a remoção sufixo em vez de dirnamebem, ou seja, você poderia fazer mkdir -p "${1%/}" && touch "$1", mesmo que askubuntu.com/a/928544/295286
Sergiy Kolodyazhnyy
7

Pode-se usar o installcomando com -Dbandeira.

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, convém considerar o uso de uma lista de itens (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
Sergiy Kolodyazhnyy
fonte
Com essa abordagem, o novo arquivo obtém permissões executáveis ​​por padrão. Para dar as mesmas permissões que receberia com o toque, pode-se usarinstall -m 644 -D /dev/null <filepath>
ricab 10/09
1

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

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

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

Purkhalo Alex
fonte