Sé que puede hacer mkdirpara crear un directorio y touchcrear un archivo, pero ¿no hay forma de hacer ambas operaciones de una vez?
es decir, si quiero hacer lo siguiente cuando la carpeta otherno 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
&¶ 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 queCOMMAND1falleCOMMAND2, 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".touchtomar un-pparámetro como lomkdirhace.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,mkdirytouchdieron erros.mktouches.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.txtAquí,
$_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
echocomando, de la siguiente manera:echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txtQue 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 -pen 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 thendeclaraciones ... puede hacerlo en una sola línea;- o en dos líneas -
- el
-perror 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 --parentspuede ser útil.Por ejemplo, si
/my/longcontiene los archivos de origen ymy/otherya existe, puede hacer esto:fuente
si quieres simple con solo 1 fragmento de parámetro:
fuente
rm -rfcomandos. - † 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 -rfnunca debe sugerirse sin una explicación y advertencias adecuadas.