Sé que puede hacer mkdir
para crear un directorio y touch
crear un archivo, pero ¿no hay forma de hacer ambas operaciones de una vez?
es decir, si quiero hacer lo siguiente cuando la carpeta other
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 ideado una función como solución para esto?
Respuestas:
Use
&&
para combinar dos comandos en una línea de shell:Nota: Anteriormente recomendé el uso de
;
para separar los dos comandos, pero como lo señaló @trysis, probablemente sea mejor usarlo&&
en la mayoría de las situaciones porque, en caso de queCOMMAND1
falleCOMMAND2
, tampoco se ejecutará. (De lo contrario, esto podría conducir a problemas que podría no haber estado esperando).fuente
&&
, como con;
, si el primer comando falla, el segundo comando seguirá ejecutándose (y también fallará, ya que ese directorio aún no existe). Con&&
si el primer comando falla, el segundo comando no se ejecuta.mkdir -p /my/other/path/here && touch $_/cpredthing.txt
. El se$_
expande esencialmente al "último argumento en el último comando ejecutado".touch
tomar un-p
parámetro como lomkdir
hace.Primero debe crear todos los directorios principales.
Si quieres ser creativo, puedes hacer una función :
Y luego úsalo como cualquier otro comando:
fuente
&&
- ¿Cómo es eso?supertouch "/tmp/abc/def ghi/jkl mno.txt"
y falló. Todos los comandosdirname
,mkdir
ytouch
dieron erros.mktouch
es.Hazlo con / usr / bin / install:
cuando no tienes un archivo fuente:
fuente
-D /dev/null
, lo cual es más fácil para mí recordar.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 podría ser el resultado, puede probarlo utilizando el
echo
comando, de la siguiente manera:echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txt
Que sale como:
Como beneficio adicional, puede escribir varios archivos a la vez utilizando la expansión de llaves, por ejemplo:
De nuevo, totalmente comprobable con
echo
:fuente
fuente
dirname -z "$@" | xargs -0 mkdir -p
en su lugar, por el bien del rendimiento. (¡Deja de acechar y únete, por el amor de Dios! ;-)puedes hacerlo en dos pasos:
fuente
fuente
como vi y probé en un foro de Unix, esto resuelve el problema
fuente
sin necesidad de
if then
declaraciones ... puede hacerlo en una sola línea;
- o en dos líneas -
- el
-p
error de prevención regresa si el directorio ya existe (que es lo que vine a buscar aquí :))fuente
En el caso especial (pero no infrecuente) en el que intenta recrear la misma jerarquía de directorios,
cp --parents
puede ser útil.Por ejemplo, si
/my/long
contiene los archivos de origen ymy/other
ya existe, puede hacer esto:fuente
si quieres simple con solo 1 fragmento de parámetro:
fuente
rm -rf
comandos. - † Es decir, horas , suponiendo que se adhiera a una política sensata de control de versiones / copia de seguridad ... de lo contrario, podrían pasar meses.rm -rf
nunca debe sugerirse sin una explicación y advertencias adecuadas.