AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 765334
Accepted
image_muck
image_muck
Asked: 2023-12-22 04:50:30 +0800 CST2023-12-22 04:50:30 +0800 CST 2023-12-22 04:50:30 +0800 CST

O comando Renomear pareceu remover vários arquivos. Posso recuperá-los?

  • 772

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.

rename
  • 2 2 respostas
  • 97 Views

2 respostas

  • Voted
  1. Chris Davies
    2023-12-22T05:05:49+08:002023-12-22T05:05:49+08:00

    Considere o comando que você executou:

    rename 's/\.zip$/\.cbz/' *.zip
    

    Isso altera os últimos quatro caracteres de cada nome de arquivo ou diretório * que corresponde ao padrão glob *.zipno diretório atual de .zippara .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, renamerecusarei renomear um item (arquivo) onde o nome de destino já exista:

    touch a.zip a.zap
    rename 's/\.zip$/.zap/' *.zip
    a.zip not renamed: a.zap already exists
    

    Descobri que cerca de 2/3 dos meus arquivos estavam faltando depois

    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 seu historypara 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 ./nameformato modificado em vez de simples name. Por exemplo, mv -- -a dashapara renomear -apara dash.

    • 3
  2. Best Answer
    Stéphane Chazelas
    2023-12-22T14:27:09+08:002023-12-22T14:27:09+08:00
    $ touch {comic5,{a..d}}.zip './--e=BEGIN{unlink for <c*>}#.zip'
    $ ls
     a.zip   b.zip   comic5.zip   c.zip   d.zip  '--e=BEGIN{unlink for <c*>}#.zip'
    
    $ rename 's/\.zip$/\.cbz/' *.zip
    $ ls
     a.zip   b.zip   d.zip  '--e=BEGIN{unlink for <c*>}#.zip'
    

    Ops! Todos os arquivos cujo nome começa com cforam removidos.

    Para a File::Renameimplementação do rename, 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:

    rename 's/\.zip\z/\.cbz/' ./*.zip
    

    Com esse ./prefixo evitando que qualquer nome de arquivo zip seja considerado uma opção por rename¹.

    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:

    printf '%s\0' *.zip | rename -0 's/\.zip/\.cbz/'
    

    Que com shells onde printfestá embutido (a maioria) também funciona em torno do Argument list too longlimite.

    Ou use zsh's zmvque não apresenta esse tipo de problema, possui algumas proteções extras e geralmente é mais fácil de usar²:

    autoload -Uz zmv
    zmv '(*).zip' '$1.cbz'
    

    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 uma rename()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 que shred/ wipefaz 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, renamenormalmente 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 como renameuso-e <the-target> e isso retornaria falso para um link simbólico que não resolve como para -eo [utilitário:

    $ touch a.zip
    $ ln -s /x a.bcz
    $ ls -n
    total 4
    lrwxrwxrwx 1 1000 1000 2 Dec 22 08:39 a.bcz -> /x
    -rw-r--r-- 1 1000 1000 0 Dec 22 08:39 a.zip
    
    $ rename -v 's/\.zip$/\.bcz/' *.zip
    a.zip renamed as a.bcz
    $ ls -n
    total 0
    -rw-r--r-- 1 1000 1000 0 Dec 22 08:39 a.bcz
    

    Ops! Esse a.bczlink 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 umsudo find / -iname 'comic5.zip' -o -iname 'comic5.cbz'


    ¹ Observe também o \zlocal $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 .zipe não em nova linha, então isso não seria um problema).

    ² mesmo que geralmente seja mais lento, pois chama um mvpor arquivo. Embora você possa executar zmodload zsh/filespara obter um arquivo mv.

    • 2

relate perguntas

  • Como substituir uma string em todos os nomes de pastas e arquivos [duplicado]

  • Como pode truncar um nome de arquivo após um determinado caractere

  • Remova caracteres de nomes de arquivos recursivamente

  • Krename: como reiniciar a numeração para cada pasta?

  • Renomeie (acrescentar) arquivos CSV em massa com base em um valor dentro

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve