Crear archivo y su directorio padre.

Sé que el comando touch crea un archivo:

 touch test1.txt 

¿Pero cómo puedo crear un archivo y su ruta completa?

por ejemplo mi escritorio no contiene nada:

 ~/Desktop/$ ls ~/Desktop/$ 

y quiero crear 1.txt en ~/Desktop/a/b/c/d/e/f/g/h/1.txt . ¿Puedo hacer esto con un simple comando como:

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

En lugar de crear la ruta completa manualmente y luego crear el archivo?

touch no puede crear directorios, necesita mkdir para eso.

Sin embargo, mkdir tiene la opción útil -p / --parents que crea una estructura de directorios completa.

De man mkdir :

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

Así que el comando que necesita en su situación específica es:

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

Si crees que necesitarás esto más a menudo y no quieres escribir la ruta dos veces cada vez, también puedes hacer una función Bash o un script para ella.

  • Función Bash (agregue esta línea a ~/.bashrc para tenerla permanentemente disponible para su usuario, de lo contrario, se desvanecerá de nuevo cuando salga de su terminal):

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

    Se puede usar simplemente así:

     touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt 
  • Bash script (guárdelo en /usr/local/bin/touch2 usando sudo para que esté disponible para todos los usuarios, de lo contrario, en ~/bin/touch2 para su usuario):

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

    No olvide hacer el script ejecutable usando chmod +x /PATH/TO/touch2 .

    Después de eso también puedes ejecutarlo así:

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

Uno puede usar el comando de install con la bandera -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$ 

Si tenemos varios archivos, podríamos considerar usar una lista de elementos (nota, recuerde citar elementos con espacios), e iterar sobre ellos:

 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 alternativamente 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 

Para este propósito puedes crear tu propia función, ejemplo abajo:

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

Primero insertamos una función al final del archivo ~ / .bashrc usando el comando echo. El indicador -p en la función permite crear las carpetas anidadas, como fldr2 de nuestro ejemplo. Finalmente, actualizamos el archivo con el comando fuente y finalmente ejecutamos el comando mkfile creado recientemente.