Crear archivo y su directorio padre


19

Sé que ese touchcomando 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 comando simple 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?

Respuestas:


23

touchno es capaz de crear directorios, necesitas mkdireso.

Sin embargo, mkdirtiene la opción -p/ útil --parentsque crea una estructura de directorio completa.

De man mkdir:

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

Entonces, 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 cree que necesitará esto con más frecuencia y no desea escribir la ruta dos veces cada vez, también puede hacer una función Bash o un script para ello.

  • Función Bash (agregue esta línea para ~/.bashrctenerla disponible de forma persistente para su usuario, de lo contrario se desvanecerá nuevamente 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
    
  • Script Bash (guárdelo /usr/local/bin/touch2usando sudo para que esté disponible para todos los usuarios, de lo contrario ~/bin/touch2solo para su usuario):

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

    No olvide hacer que el script sea 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
    

¿Puedo editar el touch comando original y agregarle un interruptor -p?
MA Heshmat Khah

3
@HeshmatKhah Debería ser posible, pero no se recomienda sombrear los ejecutables del sistema con sus propios scripts o funciones. Puede usar el nombre touch-p(¡sin espacio!) En lugar de touch2, si prefiere la "p", pero no intentaría reemplazar el comando original.
Byte Commander

1
Tenga en cuenta que puede usar la eliminación de sufijos en lugar de dirnametambién, es decir, puede hacer lo mkdir -p "${1%/}" && touch "$1"mismo que askubuntu.com/a/928544/295286
Sergiy Kolodyazhnyy

7

Se puede usar el installcomando con -Dbandera.

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 (tenga en cuenta, recuerde citar los 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

Con este enfoque, el nuevo archivo obtiene permisos ejecutables de forma predeterminada. Para darle los mismos permisos que se obtendría con tacto, se puede utilizarinstall -m 644 -D /dev/null <filepath>
ricab

1

Para este propósito, puede crear su propia función, ejemplo a continuación:

$ 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 carpetas anidadas, como fldr2 de nuestro ejemplo. Finalmente, actualizamos el archivo con el comando fuente y finalmente ejecutamos el comando mkfile creado recientemente

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.