Estoy intentando revertir un cambio que hice a través de rename
.
Estaba cambiando el nombre de los archivos en una subcarpeta y, sin pensarlo, intenté borrar los ..
nombres usando:
rename "s/.././" *
Ahora tengo una carpeta de 600 archivos con las 2 primeras letras de cada nombre de archivo cambiadas a.zzyGir*
¿Hay alguna manera de cambiar el "." ¿Volver a las primeras letras de cada nombre de archivo sin perder todo el archivo?
Probé diferentes cosas sin suerte, como por ejemplo:
rename "s/./Di/; *
También estoy abierto a soluciones de un archivo a la vez; principalmente intento evitar perder los archivos.
Respuesta1
Las dos primeras letras son historia. No hay posibilidad de recuperarlos. Pero puedes cambiar el nombre de los archivos para quitarles el encabezado .
con el siguiente procedimiento.
Asegúrate de tenerlo bash
en una terminal.
bash
Vaya a su carpeta con nombres de archivos incorrectos
shopt -s dotglob
rename -n 's/^\./Di/' *
Si todo se ve bien
rename 's/^\./Di/' *
Terminar con
shopt -u dotglob
Explicación
rename -n "s/^\./Di/" *
-n
Ninguna acción: imprima los nombres de los archivos a los que se les va a cambiar el nombre, pero no los cambie.
/^\./
^
afirmar la posición al inicio de la cadena\.
.
coincide literalmente con el personaje
shopt -s dotglob
&shopt -u dotglob
shopt
shopt [-pqsu] [-o] [optname …]
Alterna los valores de las configuraciones que controlan el comportamiento opcional del shell.
-s
Habilite (establezca) cada nombre de opción.
-u
Deshabilite (desarme) cada nombre de opción.
dotglob
Si está configurado, Bash incluye nombres de archivos que comienzan con a
.
en los resultados de la expansión del nombre de archivo.
Ejemplo
$ ls -oag
total 88
drwxrwxr-x 2 4096 Jul 17 17:16 .
drwxr-xr-x 226 86016 Jul 17 17:13 ..
-rw-rw-r-- 1 0 Jul 17 17:16 .foo
$ rename "s/^\./Di/" *
$ ls -oag
total 88
drwxrwxr-x 2 4096 Jul 17 17:16 .
drwxr-xr-x 226 86016 Jul 17 17:13 ..
-rw-rw-r-- 1 0 Jul 17 17:16 Difoo
No estoy seguro de qué quieres decir con esto.
¿Hay alguna manera de cambiar el "." volver a las primeras letras de cada nombre de archivo
¿Te refieres a algo como esto?
.zzyGir
->zzzzGir
En caso afirmativo, utilice estos comandos en un bash:
shopt -s dotglob
rename -n 's/^\.(..)(.*)/$1$1$2/' *
Verifique los resultados y cambie el nombre con
rename 's/^\.(..)(.*)/$1$1$2/' *
Y finalmente otra vez
shopt -s dotglob
Respuesta2
Según tengo entendido, tiene una carpeta con archivos como los siguientes:
ls -la
drwxrwxr-x 2 ron ron 4096 Jul 17 20:50 .
drwxrwxr-x 3 ron ron 4096 Jul 17 20:47 ..
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 .abc
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 .Gyr
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 .hig123
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 .zyz
y desea eliminar .
de todos los nombres de archivos para hacerlo:
abc
Gyr
hig123
zyz
Para esto puedes usar find
y rename
:
find . ! -path . -type f -name ".*" -exec rename -n "s/.\/.//" {} \;
El comando anterior (es decir, con -n
) es un ensayo:
find . ! -path . -type f -name ".*" -exec rename -n "s/.\/.//" {} \;
rename(./.zyz, zyz)
rename(./.abc, abc)
rename(./.Gyr, Gyr)
rename(./.hig123, hig123)
Ejecútelo sin -n
cambiar los nombres de los archivos:
find . ! -path . -type f -name ".*" -exec rename "s/.\/.//" {} \;
ls -la
total 8
drwxrwxr-x 2 ron ron 4096 Jul 17 20:59 .
drwxrwxr-x 3 ron ron 4096 Jul 17 20:47 ..
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 abc
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 Gyr
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 hig123
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 zyz