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