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 crear esos directorios automáticamente, de modo que solo tendrías que escribir
mv foo.c ~/bar/baz/
y todo saldría bien? Parece que podría alias mv a un script bash simple 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.
Respuestas:
¿Qué tal este one-liner (en bash):
Desglosando eso:
crea el directorio (incluidos todos los directorios intermedios), después de lo cual:
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 esto funcionará en otros shells, pero podría darle algunas ideas sobre qué buscar.
Aquí hay un ejemplo usando esta técnica:
fuente
./
todas partes? Los argumentos no son comandos en RUTA sin el.
directorio ...--parents
no está disponible en macOS 10.13.2. Necesitas usar-p
.mkdir -p ./some/path/foo; mv yourfile.txt $_:h
fuente
dirname
no requiere que exista su argumento, es pura manipulación de cadenas. No puedo hablar por otras distribuciones. No hay nada malo con este código de hecho.for f in *.txt; do mkdir -p `dirname /destination/${f//regex/repl}`; mv "$f" "/destination/${f//regex/repl}; done
Guardar como un script llamado mv o mv.sh
O coloque al final de su archivo ~ / .bashrc como una función que reemplaza el mv predeterminado en cada terminal nueva. El uso de una función permite que bash lo mantenga en memoria, en lugar de tener que leer un archivo de script cada vez.
Estos basados en la presentación de Chris Lutz.
fuente
mv
comando mejorado . Especialmente útil para las secuencias de comandos, es decir, no necesariamente desea ejecutar las comprobaciones y ejecutarlas enmkdir -p
cualquier momento que necesite usarmv
. Pero dado que desearía el comportamiento de error predeterminadomv
, cambié el nombre de la función amvp
, para saber cuándo podría estar creando directorios.[ ! -a "$dir" ]
que he realizado experimentos con la mitad correcta siendo verdadero y falso, ambos evaluados como verdaderos? Por el bien de los demás, tmp = "$ {tmp: -1}" parece tomar el último carácter del archivo para asegurarse de que no sea una ruta (/)Puedes usar
mkdir
:Un script simple para hacerlo automáticamente (no probado):
fuente
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 en el medio de escribir el
mv
comando, pero encontré algo que funciona bien para eso:Si
mv
falla (el directorio no existe), creará el directorio (que es el último argumento del comando anterior, también lo$_
tiene). Simplemente ejecute este comando, luego upvuelva a ejecutarlo, y esta vezmv
debería tener éxito.fuente
¿El siguiente script de shell, tal vez?
Esa es la parte básica. Es posible que desee agregar un poco para verificar los argumentos, y puede que desee que el comportamiento cambie si el destino existe o si el directorio fuente existe o no existe (es decir, no sobrescriba algo que no existe) .
fuente
rsync comando puede hacer el truco solo si el último directorio en la ruta de destino no existe, por ejemplo, para la ruta de destino de
~/bar/baz/
ifbar
existe perobaz
no existe , entonces se puede usar el siguiente comando:rsync -av --remove-source-files foo.c ~/bar/baz/
En este caso, el
baz
directorio se creará si no existe. Pero si ambosbar
ybaz
no existen, rsync fallará:Entonces, básicamente, debería ser seguro de usar
rsync -av --remove-source-files
como un alias paramv
.fuente
La forma más sencilla de hacerlo es:
Supongamos que descargué archivos pdf ubicados en mi directorio de descargas (
~/download
) y quiero moverlos a un directorio que no existe (digamosmy_PDF
).Escribiré el siguiente comando (asegurándome de que mi directorio de trabajo actual sea
~/download
):Puede agregar una
-p
opción amkdir
si desea crear subdirectorios así: (se supone que quiero crear un subdirectorio llamadopython
):fuente
Más tonto, pero trabajando de la manera:
Cree el directorio con mkdir -p, incluido un directorio temporal que comparta el nombre del archivo de destino, luego elimine ese directorio con un simple rmdir, luego mueva su archivo a su nuevo destino. Sin embargo, creo que la respuesta usando dirname es probablemente la mejor.
fuente
fuente
Código:
Ejemplo:
argumentos: "d1" "d2 / sub"
fuente
Esto se moverá
foo.c
al nuevo directoriobaz
con el directorio padrebar
.La
-p
opciónmkdir
creará directorios intermedios según sea necesario.Sin
-p
todos los directorios en el prefijo de ruta ya debe existir.Todo lo que está dentro de los backticks
``
se ejecuta y la salida se devuelve en línea como parte de su comando.Como
mkdir
no devuelve nada, solo la salida deecho $_
se agregará al comando.$_
hace referencia al último argumento al comando ejecutado anteriormente.En este caso, devolverá la ruta a su nuevo directorio (
~/bar/baz/
) pasado almkdir
comando.Descomprimí un archivo sin dar un destino y quería mover todos los archivos excepto
demo-app.zip
de mi directorio actual a un nuevo directorio llamadodemo-app
.La siguiente línea hace el truco:
ls -A
devuelve todos los nombres de archivo, incluidos los archivos ocultos ( excepto los implícitos.
y..
).El símbolo de canalización
|
se utiliza para canalizar la salida dells
comandogrep
( una utilidad de búsqueda de texto sin formato en la línea de comandos ).El
-v
indicador dirigegrep
a buscar y devolver todos los nombres de archivo, exceptodemo-app.zip
.Esa lista de archivos se agrega a nuestra línea de comandos como argumentos de origen para el comando mover
mv
. El argumento objetivo es la ruta al nuevo directorio pasado amkdir
referenciado usando$_
y salida usandoecho
.fuente
Incluso puedes usar extensiones de llaves:
Tienes que usar bash 3.0 o más reciente.
fuente
fuente
Mi solución de una cadena:
fuente
Puede encadenar comandos:
mkdir ~/bar/baz | mv foo.c ~/bar/baz/
o el script de shell está aquí:
1. Abra cualquier editor de texto
2. Copie y pegue el script de shell.
3. Guárdelo como mkdir_mv.sh
4. Ingrese el directorio de su script:
cd your/script/directory
5. Cambie el modo de archivo :
chmod +x mkdir_mv.sh
6. Establezca el alias :
alias mv="./mkdir_mv.sh"
Ahora, cada vez que ejecute el comando
mv
, se creará un directorio móvil si no existe.fuente
Basado en un comentario en otra respuesta, aquí está mi función de shell.
Incluya esto en .bashrc o similar para que pueda usarlo en todas partes.
fuente