archivos cp o mv en el mismo directorio en el que ya están cuando estoy en otro?

12

Si estoy ~/bloby tengo un archivo en~/blob/a_long_directory_name/c/x.x

puedo teclear

mv blob/a_long_directory_name/c/x.x blob/a_long_directory_name/even_more/y.y

¿Hay algún atajo por el cual pueda escribir algo más corto que use la ruta del directorio en el primer parámetro (aunque no es mi directorio actual), por ejemplo

mv blob/a_long_directory_name/c/x.x $same_dir/y.y

donde algo así $same_dirapunte al directorio de param 1

Michael Durrant
fuente

Respuestas:

8

Para minimizar la cantidad de escritura, probablemente sea más fácil hacerlo en dos pasos. CD al directorio, luego mover.

Si solo tiene un comando, puede usar una subshell:

$ (cd blob/a_long_directory_name/c/ && mv x.x y.y )

Eso significa cdque solo tendrá efecto en la subshell, mvsolo sucederá si cdtiene éxito y el directorio de trabajo de su shell actual no cambiará.

Si tiene más de un comando, use la pila de directorios.

$ pushd blob/a_long_directory_name/c/
$ mv x.x y.y
$ mv z.z q.q
$ popd
Alan Shutko
fuente
Esto no aborda la even_moreruta relativa ...
Inútil
Eso es correcto. El ejemplo $ same_dir parecía ignorarlo también.
Alan Shutko
+1 me gusta Muy fácil de recordar y hacer, y eso es clave para mí
Michael Durrant
Interesante, ya que no hace lo que pediste. Tal vez su pregunta no es exactamente lo que pretendía?
Inútil el
Inútil, actualicé mi título para aclarar que se trata de archivos cp / mv y mantenerlos en el mismo directorio, aunque yo esté en otro. por cierto, tu nombre de usuario es lindo pero hace que los comentarios se vean tontos cuando se usan en ellos :)
Michael Durrant
5

Puede usar las capacidades de sustitución de texto de su shell. En bash, podrías usar una bestia como:

mv blob/a_long_directory_name/c/xx !#:$:gs^c/xx^evenmore/yy

Para desglosarlo:

!# es la línea actual escrita hasta ahora

:$pide elegir la última palabra (reemplazar con un número npara elegir nla palabra) de la cadena en consideración ( !#en este caso). La última palabra de la línea escrita hasta ahora sería la palabra anterior.

:gs^xx^yyrealiza gla sustitución textual global ( ) sen la palabra resultante, reemplazando 'xx' con 'yy'. ^es solo un delimitador para que el scomando permita su uso /en sus patrones.

Este método es un poco más general, ya que le permite reemplazar cualquier parte de la ruta ('xx') con cualquier otra palabra ('yy').

Finalmente, como con cualquier manipulación de historial, es bueno tener las opciones de shell apropiadas establecidas (por ejemplo, en ~/.bashrc). En este caso

shopt -s histverify

mostrará la línea editada después de presionar Intro, por lo que aún puede editarla y verificar si hay errores.

No estoy seguro de por qué usarías una construcción como esa, pero funciona en este caso.

Wojtek
fuente
a) el ruido de línea demasiado (comparar a una expansión de llaves elegante) b) no resuelve el problema de la OP: quieren sustituir c/x.xcon evenmore/y.ymantener el prefijo de ruta original.
Joseph R.
Su segundo comentario fue una simple omisión de mi parte, que requirió una edición simple para corregir. No veo cómo esta respuesta merecía un voto negativo. Con la edición (tecnicismo), resuelve el problema y es más general, ya que permite intercambiar cualquier parte de la ruta (a menudo utilicé algo similar $PWD). Claro, tal vez no sea el más elegante, pero señala el hecho de que el shell tiene sustituciones textuales y designadores de palabras, que algunos usuarios aún pueden encontrar útiles para investigar.
Wojtek
OKAY. Estoy corregido.
Joseph R.