Usando Ubuntu 22.04
Eu tinha uma pasta com vários arquivos e queria alterar a extensão do arquivo, então usei:
rename 's/\.zip$/\.cbz/' *.zip
O comando foi concluído sem gerar erros, mas descobri que cerca de 2/3 dos meus arquivos estavam faltando depois. Acho que tem a ver com os nomes de alguns arquivos que contêm colchetes ou aspas, mas sei que alguns arquivos ausentes tinham nomes muito simples ( comic5.zip
) e vejo que agora falta todo arquivo cujo nome começa com colchetes.
Tentei usar o photorec para recuperar os arquivos, mas não consegui encontrar nenhum deles.
O tamanho da pasta é muito menor agora, o que parece indicar que eles foram excluídos, mas se fosse esse o caso, eu teria pensado que o Photorec seria capaz de recuperar pelo menos alguns deles . Apenas usando meu explorador de arquivos, a pasta tinha aproximadamente 120 GB antes de executar o comando e aproximadamente 40 GB depois. Infelizmente, não observei o número real de arquivos antes do comando, mas também pude perceber, apenas percorrendo, que há muito menos arquivos.
Alguém sabe o que aconteceu com os arquivos e se eles podem ser recuperados?
$ rename -V
/usr/bin/rename using File::Rename version 1.30, File::Rename::Options version 1.10
Atualizar:
Acontece que esqueci de alterar algumas das minhas configurações anteriores no photorec, executei novamente e ele encontrou os arquivos ausentes, tenho certeza de que todos os arquivos foram recuperados agora. Acho que isso confirma que os arquivos foram de fato excluídos. Ainda não tenho certeza de como isso aconteceu, mas acho que a explicação de Stéphane é a mais provável.
De qualquer forma, obrigado pela ajuda.
Considere o comando que você executou:
Isso altera os últimos quatro caracteres de cada nome de arquivo ou diretório * que corresponde ao padrão glob
*.zip
no diretório atual de.zip
para.cbz
. Isso é tudo. Ele usa uma expressão de substituição Perl para realizar essa renomeação.Além disso, pelo menos no meu sistema,
rename
recusarei renomear um item (arquivo) onde o nome de destino já exista:Não consigo ver nada + razoável no cenário que você descreveu que faria com que arquivos (ou diretórios, etc.) desaparecessem. Talvez houvesse outro comando como
mv
, que não executa verificações de integridade antes de substituir. Verifique o seuhistory
para ver o que isso mostra a você* Na verdade, ele renomeará qualquer tipo de item, seja arquivo normal, diretório, dispositivo, canal... mas somente onde corresponder aos critérios que descrevi
+ Arquivos que começam com um travessão (
-
) ou travessão duplo (--
) são sempre problemáticos. Aqui também, a menos que você proteja seus padrões de arquivo separando argumentos de comando e argumentos de arquivo com um formato autônomo--
ou usando um./name
formato modificado em vez de simplesname
. Por exemplo,mv -- -a dasha
para renomear-a
paradash
.Ops! Todos os arquivos cujo nome começa com
c
foram removidos.Para a
File::Rename
implementação dorename
, esse tipo de problema foi corrigido em 1.99 (a meu pedido), mas o Ubuntu 22.04 vem com a versão 1.30.Aqui, você desejaria:
Com esse
./
prefixo evitando que qualquer nome de arquivo zip seja considerado uma opção porrename
¹.Ou, com essa implementação específica de
rename
, passe a lista de arquivos por meio de sua entrada padrão em vez de argumentos:Que com shells onde
printf
está embutido (a maioria) também funciona em torno doArgument list too long
limite.Ou use
zsh
'szmv
que não apresenta esse tipo de problema, possui algumas proteções extras e geralmente é mais fácil de usar²:Agora, é improvável que esse tipo de coisa aconteça por acaso. Se foi isso que aconteceu, alguém teria plantado um arquivo malicioso com nome semelhante no diretório atual, sabendo que você executaria tal comando.
Se o código malicioso o fez
unlink()
ou se os arquivos foram removidos como resultado de umarename()
substituição do arquivo, você pode ter alguma sorte usando alguma abordagem de recuperação/recuperação do sistema de arquivos . Se ele fizesse o equivalente ao queshred
/wipe
faz ou criptografasse o conteúdo antes de mover os arquivos para outro lugar, como faria o ransomware, sua melhor opção seria restaurar a partir do backup.Na ausência de nomes de arquivos maliciosos,
rename
normalmente não deve perder dados, pois verifica se o arquivo de destino existe antes de renomeá-lo. Você pode perder arquivos de links simbólicos se o alvo desses links simbólicos não estiver acessível comorename
uso-e <the-target>
e isso retornaria falso para um link simbólico que não resolve como para-e
o[
utilitário:Ops! Esse
a.bcz
link simbólico (quebrado) desapareceu.Mas os links simbólicos ocupam muito pouco espaço no disco, então isso não poderia explicar a perda de 80 dos 120 GiB que você sofreu.
Assim como Chris, suspeito que seu problema estava em outro lugar. Seus arquivos podem ainda estar lá, mas não no diretório que você acha que deveriam estar. Experimente um
sudo find / -iname 'comic5.zip' -o -iname 'comic5.cbz'
¹ Observe também o
\z
local$
que você geralmente deseja usar em regexps que correspondem a outras coisas além de linhas , como$
correspondências no final do assunto (que você deseja aqui) ou antes de um caractere de nova linha no final do assunto (que você deseja não quero, neste caso específico, o assunto termina em.zip
e não em nova linha, então isso não seria um problema).² mesmo que geralmente seja mais lento, pois chama um
mv
por arquivo. Embora você possa executarzmodload zsh/files
para obter um arquivomv
.