Cambiar el nombre del archivo (.filename) a los nombres originales

Cambiar el nombre del archivo (.filename) a los nombres originales

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 bashen 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 findy 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 -ncambiar 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

información relacionada