En Linux a veces renombre archivos como este:
mv dir1/dir2/dir3/file.txt  dir1/dir2/dir3/file.txt.old
Tenga en cuenta que solo quiero cambiar el nombre del archivo, no moverlo a otro directorio.
¿Hay algún comando que me permita hacer una versión abreviada de ese comando? Estoy pensando algo como:
mv dir1/dir2/dir3/file.txt  file.txt.old
o tal vez incluso algo como (solo agregar al nombre):
mv dir1/dir2/dir3/file.txt  {}.old
Mi objetivo no es tener que volver a especificar la ruta completa.
Sé que esos "ejemplos" que escribí no funcionan, pero es solo una idea de lo que quiero lograr.
No quiero tener que cd en el directorio.
                    
                        linux
                                filesystems
                                files
                                mv
                                
                    
                    
                        santiago arizti
fuente
                
                fuente

(cd dir1/dir2/dir3 && exec mv file.txt{,.old})tiene efectivamente el mismo rendimiento que el código sin el subproceso, ya que seexecevitafork()durante la invocación del comando externo, por lo que tiene exactamente una bifurcación en ambos sentidos.Respuestas:
para un solo archivo intente
donde se
X{a,b}expande la construcciónXa Xb, puede tener una vista previa usandopara ver si se ajusta a tu necesidad.
Nota:
eso para múltiples archivos
es poco probable que se expanda a lo que quieres. (esto se expandirá a una combinación de file.txt file1.txt.old file2.txt ...)
{txt,txt.old}se puede acortar{,.old}según el comentariosi el nombre del directorio no es ambiguo, se puede usar comodín.
para uso de múltiples archivos
renamesoltar
-npara tener un cambio de nombre efectivo.fuente
mv dir1/dir2/dir3/file.txt{,.old}No funcionaría también y sería aún más corto?El comando
renamerenombra todos los archivos coincidentes. Su objetivo principal es cambiar el nombre de varios archivos, pero si la expresión de Perl coincide con un solo archivo, cambiará el nombre de este único archivo. Para detalles y sintaxis específica de distribución por favor lea la página de manual:man rename.Ejemplo de uso: cambie el nombre de "/path/file.txt" a "/path/file.txt.old":
rename 's/file.txt/file.txt.old/g' /path/file.txtNotación más corta (gracias a shalomb):
Para un uso en seco
rename -n.Se pueden encontrar más ejemplos y detalles en https://thepcspy.com/read/bulk-rename-files-in-ubuntu/
fuente
renamecomandos diferentes con un comportamiento completamente diferente..oldel nombre de archivo, probablemente sea un poco más conveniente hacer unrename 's/$/.old/' /path/to/file.txtorename '$_.=".old"' /path/to/file.txtPara un caso único, si no quiero cambiar mi directorio actual, podría usar un sub-shell:
Debido a que está
cddentro del sub-shell, no ha cambiado su directorio en su shell realfuente
&& exec mv: de esa manera no intentas cambiar el nombre sicdfalla yexecconsume el subshell, evitando así una penalización de rendimiento.&&caso de un caso único, como dije, no me preocuparía por el costo del subconjunto (manténgalo simple: poder recordar fácilmente cómo hacerlo es la OMI más importante)Me gusta la solución de @ archemar de usar la expansión {}, porque puedes usarla cuando ya has comenzado tu línea de comando. Aquí hay algunas otras posibilidades para completar:
(las comillas solo son necesarias si tiene espacios u otros caracteres que rompen palabras en el nombre)
Notas:
mymvpuede ser cualquier cadena razonable, utilicé mymv para "mi movimiento".Otro:
pero
(de @Adam y @CharlesDuffy) es posiblemente mejor en caso de que el CD falle.
fuente
mmv, ya hay un programa llamado de esta manera.Si desea ingresar al subdirectorio para acortar el
mvcomando, pero luego desea regresar al directorio actual, hay dos formas de hacerlo. Una es poner elcdymven una subshell (como ya se ha sugerido).El otro es usar
pushdypopdcambiar directorios:El
pushdcomando es similarcd, excepto que primero inserta el nombre del directorio actual en una pila.popdelimina el nombre superior de la pila y cambia a ese directorio.fuente
pushdypopdson extensiones destinadas a uso interactivo: POSIX las enumera explícitamente como "resultados no especificados", y un shell creado para ejecutar scripts (es decir, en un entorno embebido mínimo) no necesita ser compatible.Yo solo haría
fuente
La solución que implica:
mv something{.txt,.txt.old}está utilizando un "bashismo". Si desea una forma más portátil, utilizando manipulaciones de variables comunes:fuente
${var/text/replacement}es un bashismo en sí mismo.