todos sistema seleccionar mostrar los entrar encuentran ejecutables donde directorios directorio descargas crear como carpeta linux macos unix mkdir mv

linux - sistema - ¿Hay alguna forma de hacer que mv cree el directorio al que se moverá si no existe?



mostrar todos los directorios linux (12)

¿Qué tal este one-liner (en bash):

mkdir --parents ./some/path/; mv yourfile.txt $_

Rompiendo eso

mkdir --parents ./some/path

crea el directorio (incluyendo 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, al directorio creado recientemente).

No estoy seguro de hasta qué punto funcionará esto en otros shells, pero podría darle algunas ideas sobre qué buscar.

Aquí hay un ejemplo usando 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

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 forma de que esos directorios se creen automáticamente, de modo que solo tendrías que escribir

mv foo.c ~/bar/baz/

y todo funcionaria? Parece que podría alias mv a un simple script de bash que verificaría si esos directorios existían y si no, llamaría a mkdir y luego a mv, pero pensé en verificar si alguien tenía una mejor idea.


Código:

if [[ -e $1 && ! -e $2 ]]; then mkdir --parents --verbose -- "$(dirname -- "$2")" fi mv --verbose -- "$1" "$2"

Ejemplo:

argumentos: "d1" "d2 / sub"

mkdir: created directory ''d2'' renamed ''d1'' -> ''d2/sub''


El siguiente script de shell, tal vez?

#!/bin/sh if [[ -e $1 ]] then if [[ ! -d $2 ]] then mkdir --parents $2 fi fi mv $1 $2

Esa es la parte básica. Es posible que desee agregar un poco para verificar los argumentos, y puede querer que el comportamiento cambie si el destino existe o si el directorio de origen existe o no existe (es decir, no sobrescriba algo que no existe) .


Guardar como un script llamado mv o mv.sh

#!/bin/bash # mv.sh dir="$2" 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 le permite a bash mantenerla en memoria, en lugar de tener que leer un archivo de script cada vez.

function mv () { dir="$2" tmp="$2"; tmp="${tmp: -1}" [ "$tmp" != "/" ] && dir="$(dirname "$2")" [ -a "$dir" ] || mkdir -p "$dir" && mv "$@" }

Estos basados ​​en la sumisión de Chris Lutz.


Incluso puedes usar extensiones de corsé:

mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}

  • que crea 3 directorios (directorio1, directorio2, directorio3),
    • y en cada uno de ellos dos subdirectorios (subdirectorio1, subdirectorio2),
      • y en cada uno de ellos dos subdirectorios (subdirectorio1 y subdirectorio2).

Tienes que usar bash 3.0 o más nuevo.


La forma más sencilla de hacerlo es:

mkdir [directorie name] && mv [filename] $_
Supongamos que descargué archivos pdf ubicados en mi director de descargas (~ / descargar) y quiero moverlos todos en un directorio que no se cierre (digamos "my_PDF" ).
Escribiré el siguiente comando (asegurándome de que mi actual directora de trabajo sea ~ / descargar):

mkdir my_PDF && mv *.pdf $_
Puede agregar la opción -p a mkdir si desea crear subdirectorios así: (se supone que quiero crear un subdirectorio llamado "python"):

mkdir -p my_PDF/python && mv *.pdf $_


Más tonto, pero a la manera de trabajar:

mkdir -p $2 rmdir $2 mv $1 $2

Cree el directorio con mkdir -p incluyendo un directorio temporal que comparte el nombre del archivo de destino, luego elimine ese directorio de nombres de archivos con un simple rmdir, luego mueva su archivo a su nuevo destino. Creo que la respuesta usando dirname es probablemente la mejor.


Mi solución de una cadena:

test -d "/home/newdir/" || mkdir -p "/home/newdir/" && mv /home/test.txt /home/newdir/


Parece que la respuesta es no :). Realmente no quiero crear un alias o una función solo para hacer esto, a menudo porque es único y ya estoy escribiendo el comando mv , 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, por lo que $_ tiene). Así que simplemente ejecute este comando, luego vuelva a ejecutarlo, y esta vez mv debería tener éxito.


Puedes usar mkdir :

mkdir -p ~/bar/baz/ && / mv foo.c ~/bar/baz/

Un script simple para hacerlo automáticamente (no probado):

#!/bin/sh # Grab the last argument (argument number $#) eval LAST_ARG=/$$# # Strip the filename (if it exists) from the destination, getting the directory DIR_NAME=`echo $2 | sed -e ''s_/[^/]*$__''` # Move to the directory, making the directory if necessary mkdir -p "$DIR_NAME" || exit mv "$@"


$what=/path/to/file; $dest=/dest/path; mkdir -p "$(dirname "$dest")"; mv "$what" "$dest"


mkdir -p `dirname /destination/moved_file_name.txt` mv /full/path/the/file.txt /destination/moved_file_name.txt