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 seexec
evitafork()
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
rename
soltar
-n
para 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
rename
renombra 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.txt
Notació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
rename
comandos diferentes con un comportamiento completamente diferente..old
el nombre de archivo, probablemente sea un poco más conveniente hacer unrename 's/$/.old/' /path/to/file.txt
orename '$_.=".old"' /path/to/file.txt
Para un caso único, si no quiero cambiar mi directorio actual, podría usar un sub-shell:
Debido a que está
cd
dentro del sub-shell, no ha cambiado su directorio en su shell realfuente
&& exec mv
: de esa manera no intentas cambiar el nombre sicd
falla yexec
consume 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:
mymv
puede 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
mv
comando, pero luego desea regresar al directorio actual, hay dos formas de hacerlo. Una es poner elcd
ymv
en una subshell (como ya se ha sugerido).El otro es usar
pushd
ypopd
cambiar directorios:El
pushd
comando es similarcd
, excepto que primero inserta el nombre del directorio actual en una pila.popd
elimina el nombre superior de la pila y cambia a ese directorio.fuente
pushd
ypopd
son 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.