¿Hay alguna manera de hacer que mv cree el directorio al que se moverá si no existe?
Entonces, si estoy en mi directorio de inicio y quiero mover foo.c a ~/bar/baz/foo.c , pero esos directorios no existen, ¿hay alguna manera de crear esos directorios automáticamente, de modo que solo tendrias que escribir
mv foo.c ~/bar/baz/
y todo saldría bien? Parece que podrías asignar un alias a mv para un script bash simple que verificaría si esos directorios existían y, en caso contrario, llamaría a mkdir y luego a mv, pero pensé en verificar si alguien tenía una idea mejor.
¿Qué tal esta frase (en bash):
mkdir --parents ./some/path/; mv yourfile.txt $_
Desglosando eso:
mkdir --parents ./some/path
# if it doesn't work; try
mkdir -p ./some/path
crea el directorio (incluidos todos los directorios intermedios), después de lo cual:
mv yourfile.txt $_
mueve el archivo a ese directorio ($_ se expande al último argumento pasado al comando de shell anterior, es decir: el directorio recién creado).
No estoy seguro de hasta qué punto funcionará esto en otros shells, pero podría darle algunas ideas sobre qué buscar.
A continuación se muestra un ejemplo utilizando esta técnica:
$ > ls
$ > touch yourfile.txt
$ > ls
yourfile.txt
$ > mkdir --parents ./some/path/; mv yourfile.txt $_
$ > ls -F
some/
$ > ls some/path/
yourfile.txt
mkdir -p `dirname /destination/moved_file_name.txt`
mv /full/path/the/file.txt /destination/moved_file_name.txt
Guardar como un script llamado mv.sh
#!/bin/bash
# mv.sh
dir="$2" # Include a / at the end to indicate directory (not filename)
tmp="$2"; tmp="${tmp: -1}"
[ "$tmp" != "/" ] && dir="$(dirname "$2")"
[ -a "$dir" ] ||
mkdir -p "$dir" &&
mv "$@"
O colóquelo al final de su archivo ~/.bashrc como una función que reemplaza el mv predeterminado en cada terminal nuevo. El uso de una función permite a bash conservar la memoria, en lugar de tener que leer un archivo de script cada vez.
function mvp ()
{
dir="$2" # Include a / at the end to indicate directory (not filename)
tmp="$2"; tmp="${tmp: -1}"
[ "$tmp" != "/" ] && dir="$(dirname "$2")"
[ -a "$dir" ] ||
mkdir -p "$dir" &&
mv "$@"
}
Uso de ejemplo:
mv.sh file ~/Download/some/new/path/ # <-End with slash
Estos basados en la presentación de Chris Lutz.
Parece que la respuesta es no :). Realmente no quiero crear un alias o función solo para hacer esto, a menudo porque es único y ya estoy escribiendo el mv
comando, pero encontré algo que funciona bien para eso:
mv *.sh shell_files/also_with_subdir/ || mkdir -p $_
Si mv
falla (el directorio no existe), creará el directorio (que es el último argumento del comando anterior, al igual que $_
él). Así que simplemente ejecute este comando, luego upvuelva a ejecutarlo, y esta vez mv
debería tener éxito.
La forma más sencilla de hacerlo es:
mkdir -p [path/to/directory] && mv [filename] $_
Lo bueno de esto es que sólo moverá el archivo si mkdir
tiene éxito.
Explicación :
Supongamos que descargué algunos archivos PDF ubicados en mi directorio ( ~/download
). Quiero moverlos todos a un directorio que no existe (digamos my_PDF
).
Escribiré el siguiente comando (asegurándome de que mi directorio de trabajo actual sea ~/download
):
mkdir my_PDF && mv *.pdf $_
Puede agregar -p
una opción mkdir
si desea crear subdirectorios como este: (supongamos que quiero crear un subdirectorio llamado python
):
mkdir -p my_PDF/python && mv *.pdf $_