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 bash
em 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 find
e 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 -n
realmente 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