Renomeando arquivo (.filename) para nomes originais

Renomeando arquivo (.filename) para nomes originais

Estou tentando reverter uma alteração que fiz via rename.

Eu estava renomeando arquivos em uma subpasta e, sem pensar, tentei limpar os ..nomes usando:

rename "s/.././" *

Agora tenho uma pasta de 600 arquivos com as 2 primeiras letras de cada nome de arquivo alteradas para.zzyGir*

Existe alguma maneira de alterar o "." voltar às primeiras letras de cada nome de arquivo sem perder o arquivo inteiro?

Eu tentei coisas diferentes sem sorte, como:

rename "s/./Di/; *

Também estou aberto a soluções de um arquivo por vez, principalmente tentando evitar a perda dos arquivos.

Responder1

As duas primeiras letras são história. Não há chance de recuperá-los. Mas você pode renomear os arquivos para remover a liderança .com o procedimento abaixo

Certifique-se de ter o bashem um terminal

bash

Entre na sua pasta com os nomes de arquivo errados

shopt -s dotglob
rename -n 's/^\./Di/' *

Se tudo parece bem

rename 's/^\./Di/' *

Terminar com

shopt -u dotglob

Explicação

  • rename -n "s/^\./Di/" *

    • -n

      Nenhuma ação: imprima os nomes dos arquivos a serem renomeados, mas não renomeie.

    • /^\./

      • ^afirmar a posição no início da string

      • \.corresponde ao personagem .literalmente

  • shopt -s dotglob&shopt -u dotglob

    • shopt

      shopt [-pqsu] [-o] [optname …]
      

      Alterne os valores das configurações que controlam o comportamento opcional do shell.

    • -s

      Habilite (defina) cada nome de opção.

    • -u

      Desabilite (desabilite) cada nome de opção.

    • dotglob

      Se definido, o Bash inclui nomes de arquivos começando com a .nos resultados da expansão do nome de arquivo.


Exemplo

$ 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

Não tenho certeza do que você quer dizer com isso

Existe alguma maneira de alterar o "." voltar às primeiras letras de cada nome de arquivo

Você quer dizer algo assim?

.zzyGir->zzzzGir

Se sim, use estes comandos em um bash:

shopt -s dotglob
rename -n 's/^\.(..)(.*)/$1$1$2/' *

Verifique os resultados e renomeie com

rename 's/^\.(..)(.*)/$1$1$2/' *

E finalmente novamente

shopt -s dotglob

Responder2

Pelo que entendi você tem uma pasta com arquivos como abaixo:

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

e você deseja remover .todos os nomes de arquivo para torná-lo:

abc
Gyr
hig123
zyz

Para isso você pode usar finde rename:

find . ! -path . -type f -name ".*" -exec rename -n "s/.\/.//" {} \;

O comando acima (ou seja, com o -n) é uma simulação:

find . ! -path . -type f -name ".*" -exec rename -n "s/.\/.//" {} \;
rename(./.zyz, zyz)
rename(./.abc, abc)
rename(./.Gyr, Gyr)
rename(./.hig123, hig123)

Execute-o sem -nrealmente alterar os nomes dos arquivos:

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

informação relacionada