Crea il file e la sua directory principale


19

So che il touchcomando crea un file:

touch test1.txt

ma come posso creare un file e il suo percorso completo?

per esempio il mio desktop non contiene nulla:

~/Desktop/$ ls
~/Desktop/$

e voglio creare 1.txt in ~/Desktop/a/b/c/d/e/f/g/h/1.txt. Posso farlo con un semplice comando come:

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

invece di creare manualmente il percorso completo e quindi creare il file?

Risposte:


23

touchnon è in grado di creare directory, è necessario mkdirper quello.

Tuttavia, mkdirha l'utile -p/ --parentsopzione che crea una struttura di directory completa.

Da man mkdir:

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

Quindi il comando che ti serve nella tua situazione specifica è:

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

Se pensi di averne bisogno più spesso e non vuoi digitare il percorso due volte ogni volta, puoi anche creare una funzione Bash o uno script per esso.

  • Funzione Bash (aggiungi questa linea per ~/.bashrcaverla in modo persistente a disposizione del tuo utente, altrimenti svanirà di nuovo quando esci dal tuo terminale):

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

    Può essere semplicemente usato in questo modo:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
  • Bash script (memorizzalo /usr/local/bin/touch2usando sudo per renderlo disponibile per tutti gli utenti, altrimenti ~/bin/touch2solo per il tuo utente):

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

    Non dimenticare di rendere eseguibile lo script utilizzando chmod +x /PATH/TO/touch2.

    Successivamente puoi anche eseguirlo in questo modo:

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

posso modificare il touch comando originale e aggiungere switch -pad esso?
MA Heshmat Khah,

3
@HeshmatKhah Dovrebbe essere possibile, ma non è consigliabile oscurare gli eseguibili di sistema con i propri script o funzioni. Potresti usare il nome touch-p(senza spazio!) Invece di touch2, se preferisci la "p", ma non tenterei di sostituire il comando originale.
Byte Commander

1
Si noti che è possibile utilizzare la rimozione del suffisso anziché dirnameanche, vale a dire che si potrebbe fare mkdir -p "${1%/}" && touch "$1", come askubuntu.com/a/928544/295286
Sergiy Kolodyazhnyy il

7

Si può usare il installcomando con -Dflag.

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 disponiamo di più file, potremmo prendere in considerazione l'utilizzo di un elenco di elementi (nota, ricordati di citare gli elementi con spazi) e di iterare su di essi:

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

O in alternativa con 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

Con questo approccio, il nuovo file ottiene le autorizzazioni eseguibili per impostazione predefinita. Per dargli le stesse autorizzazioni che otterrebbe con il tocco, si può usareinstall -m 644 -D /dev/null <filepath>
ricab

1

A tale scopo è possibile creare la propria funzione, esempio di seguito:

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

Innanzitutto inseriamo una funzione alla fine del file ~ / .bashrc usando il comando echo. Il flag -p in funzione consente di creare cartelle nidificate, come fldr2 dal nostro esempio. Alla fine aggiorniamo il file con il comando source ed eventualmente eseguiamo il comando mkfile creato di recente

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.