¿Hay alguna manera de hacer que mv cree el directorio al que se moverá si no existe?

Resuelto Paul Wicks asked hace 15 años • 21 respuestas

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.

Paul Wicks avatar Feb 14 '09 04:02 Paul Wicks
Aceptado

¿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
KarstenF avatar Feb 13 '2009 22:02 KarstenF
mkdir -p `dirname /destination/moved_file_name.txt`  
mv /full/path/the/file.txt  /destination/moved_file_name.txt
Billmc avatar Jun 21 '2012 19:06 Billmc

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.

Sepero avatar Apr 26 '2012 03:04 Sepero

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 mvcomando, pero encontré algo que funciona bien para eso:

mv *.sh shell_files/also_with_subdir/ || mkdir -p $_

Si mvfalla (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 mvdebería tener éxito.

Pat avatar Mar 14 '2016 19:03 Pat

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 mkdirtiene é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 -puna opción mkdirsi desea crear subdirectorios como este: (supongamos que quiero crear un subdirectorio llamado python):

mkdir -p my_PDF/python && mv *.pdf $_
Abdoul Seibou avatar Jul 07 '2017 18:07 Abdoul Seibou