Cambiar el directorio al objetivo de la operación de movimiento

12

Ocasionalmente, he editado algún archivo y quiero moverlo a una carpeta diferente. (Típicamente: a una carpeta de Dropbox, donde no quería trabajar para evitar darles a los otros propietarios de la carpeta actualizaciones constantes). Lo hago, por ejemplo, con

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

Después, a menudo me encuentro con ganas de cambiar el directorio al directorio de destino de mi operación de movimiento anterior. Me encuentro presionando la flecha hacia arriba, borrando la final file.pdf, sosteniendo a la izquierda, borrando mv file.pdfy reemplazando con cd.

¿Hay una manera más rápida e inteligente de hacer esto? ¿Hay un comando "mover archivo y luego cambiar directorio a", o un acceso directo para el último directorio utilizado, o algo así?

Mees de Vries
fuente
1
si mantiene presionada la tecla CTRL + Izquierda, irá a la izquierda por palabra, lo que es más rápido
cat
Comentario lateral, no una respuesta a su pregunta de shell: normalmente solo detengo Dropbox mientras edito. También asegura que ningún otro archivo se cambie "bajo mis pies".
Constantino Tsarouhas

Respuestas:

17

Si está usando bash, entonces su interacción con el historial tiene solo el atajo para esto. La palabra designadora para el último argumento del comando anterior:

!!:$
designa el último argumento del comando anterior. Esto se puede acortar a !$.

Combinado con un modificador para eliminar el último componente de nombre de ruta:

Después del designador de palabras opcional, puede agregar una secuencia de uno o más de los modificadores válidos , cada uno precedido por un ':'.

h
Elimine un componente de nombre de ruta final, dejando solo la cabeza.

Entonces:

$ echo /ab/c/d
/ab/c/d
$ echo !$:h
echo /ab/c
/ab/c

El mismo acceso directo también se puede usar con zsh.

muru
fuente
1
Esto es genial.
Élder Geek
4

Si no está cambiando el nombre del archivo, puede omitirlo y mv lo agregará automáticamente; Esto es especialmente útil al mover varios archivos:

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/

mv *.pdf ../../../Dropbox/sharedfolder/subdirectory/

Con el directorio como último argumento, puede usar !!:$o !$como describe la respuesta de muru.
Si usa bash con los valores predeterminados habituales, puede usar Alt+ en su .lugar.
(Este es el insert-last-argumentcomando readline ; bind -penumerará todos sus enlaces actuales).

deltab
fuente
1
tenga en cuenta que omitir el nombre de archivo de destino puede sobrescribir silenciosamente el archivo de destino si ya existeis
cat
mvsiempre sobrescribe los archivos de destino en silencio a menos que especifique las opciones -i/ --interactiveo -n/ --no-clobber. Es por eso que tengo alias mv='mv -i' cp='cp -i'en mi .bashrc.
David Foerster
-1

Otro enfoque es crear su propio comando dedicado para este propósito. Esto se puede hacer a través de una función que podría verse así:

$ function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }

Donde: (1) mv-special es el nombre de la función; (2) las variables $1y $2son argumentos en la función que serán utilizados por los comandos mvy cd; (3) $(echo $2-) agrega un carácter salvaje al final de la cadena en var $2, y corrige el comportamiento de dirnamesi la variable $2contiene solo la ruta; (4) $(dirname $(echo $2-)) filtrará solo la ruta desde $2.

Según esta respuesta, la función podría verse así:

$ function mv-special { mv $1 $2; cd ${2%/*}; }

Donde: ${2%/*}filtrará solo la ruta desde $2.

Para estar disponible como comando, esta función debe exportarse :

$ export -f mv-special

Uso:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

o:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/

Por favor, preste atención a eso, para ambas variantes, el segundo argumento ( $2) debe terminar con nombre de archivo o barra inclinada ( /).

Para que nuestro nuevo comando esté permanentemente disponible, la definición de la función y el comando de exportación deben adjuntarse a ~/.bashrc:

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }
export -f mv-special

o:

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd ${2%/*}; }
export -f mv-special

ingrese la descripción de la imagen aquí


Se puede realizar un comando personalizado y mediante un archivo de script ejecutable que se coloca ~/binen /usr/sbin: ¿Cómo puedo crear un comando de terminal personalizado (para ejecutar un script)? Pero para ser honesto, me enfrenté a un problema con el comportamiento de cdeste escenario.

pa4080
fuente