world script hello example espaƱol linux bash shell unix scripting

linux - script - Unix: crea una ruta de carpetas y archivos



shell script unix (11)

En el caso especial (pero no poco común) en el que intentas recrear la misma jerarquía de directorios, cp --parents puede ser útil.

Por ejemplo, si /my/long contiene los archivos fuente, y my/other ya existe, puede hacer esto:

cd /my/long cp --parents path/here/thing.txt /my/other

Sé que puedes hacer mkdir para crear un directorio y touch para crear un archivo, pero ¿no hay forma de hacer ambas operaciones de una vez?

es decir, si quiero hacer lo siguiente cuando la other carpeta no existe:

cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

Error:

cp: cannot create regular file `/my/other/path/here/cpedthing.txt'': No such file or directory

¿Alguien ha encontrado una función como solución para esto?


Esto es lo que haría:

mkdir -p /my/other/path/here && touch $_/cpredthing.txt

Aquí, $_ es una variable que representa el último argumento del comando anterior que ejecutamos en línea.

Como siempre, si desea ver cuál puede ser el resultado, puede probarlo utilizando el comando echo , de esta manera:

echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txt

Que resultados como:

mkdir -p /code/temp/other/path/here touch /code/temp/other/path/here/cpredthing.txt

Como beneficio adicional, puede escribir varios archivos a la vez usando la expansión de llaves, por ejemplo:

mkdir -p /code/temp/other/path/here && touch $_/{cpredthing.txt,anotherfile,somescript.sh}

De nuevo, totalmente comprobable con echo :

mkdir -p /code/temp/other/path/here touch /code/temp/other/path/here/cpredthing.txt /code/temp/other/path/here/anotherfile /code/temp/other/path/here/somescript.sh


Hazlo con / usr / bin / install:

install -D /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

cuando no tienes un archivo fuente:

install -D <(echo 1) /my/other/path/here/cpedthing.txt


Primero debe crear todos los directorios principales.

FILE=./base/data/sounds/effects/camera_click.ogg mkdir -p "$(dirname "$FILE")" && touch "$FILE"

Si quieres ser creativo, puedes hacer una función :

mktouch() { if [ $# -lt 1 ]; then echo "Missing argument"; return 1; fi for f in "$@"; do mkdir -p -- "$(dirname -- "$f")" touch -- "$f" done }

Y luego usarlo como cualquier otro comando:

mktouch ./base/data/sounds/effects/camera_click.ogg ./some/other/file


Usa && para combinar dos comandos en una línea de shell:

COMMAND1 && COMMAND2 mkdir -p /my/other/path/here/ && touch /my/other/path/here/cpedthing.txt

Nota: Anteriormente, recomendé el uso de ; para separar los dos comandos, pero como señala @trysis, probablemente sea mejor usar && en la mayoría de las situaciones porque en caso de que COMMAND1 falle, COMMAND2 tampoco se ejecutará. (De lo contrario, esto podría generar problemas que posiblemente no esperaba).


como vi y probé en un foro de UNIX esto resuelve el problema

ptouch() { for p in "$@"; do _dir="$(dirname -- "$p")" [ -d "$_dir" ] || mkdir -p -- "$_dir" touch -- "$p" done }


no es necesario if then declaraciones if then ... puedes hacerlo en una sola línea de usign ;

mkdir -p /my/other/path/here;cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

- o en dos líneas -

mkdir -p /my/other/path/here cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

- el -p evita el error si el directorio ya existe (que es lo que vine a buscar aquí :))


puedes hacerlo en dos pasos:

mkdir -p /my/other/path/here/ touch /my/other/path/here/cpedthing.txt


si quieres simple con solo 1 fragmento de param:

rm -rf /abs/path/to/file; #prevent cases when old file was a folder mkdir -p /abs/path/to/file; #make it fist as a dir rm -rf /abs/path/to/file; #remove the leaf of the dir preserving parents touch /abs/path/to/file; #create the actual file


#!/bin/sh for f in "$@"; do mkdir -p "$(dirname "$f")"; done touch "$@"


if [ ! -d /my/other ] then mkdir /my/other/path/here cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt fi