Existe uma maneira de recuperar um arquivo que eu deletei, mas ainda está aberto em algum lugar?

7

Esta questão está relacionada com Como recuperar arquivos apagados? mas é um pouco diferente na natureza.

Suponha que eu tenha um arquivo chamado ~/something open em um editor de texto. Além disso, suponha que eu abra um terminal e execute o seguinte comando enquanto o arquivo ainda estiver aberto no editor de texto:

rm ~/something

Isso excluirá o arquivo. Agora suponha que eu mudei de ideia e queria recuperar o arquivo. O arquivo ainda está aberto no editor de texto, por isso não foi removido do disco ou sistema de arquivos ainda .

Existe alguma maneira de recuperá-lo?

    
por Nathan Osman 06.11.2012 / 23:59

2 respostas

10

Não sei se existem editores de texto que mantenham o arquivo aberto enquanto você o edita. Normalmente (ou seja, no Emacs), o arquivo é lido em um buffer na RAM e, em seguida, o arquivo é fechado. Você edita somente na RAM. Quando você salva o buffer, o arquivo é aberto, gravado e fechado novamente. Você pode usar ps auxw | grep your_editor para encontrar o PID do seu editor e, em seguida, lsof -p your_PID para ver os arquivos que ainda estão abertos.

Por outro lado, se o arquivo ainda estiver no buffer do seu editor, você pode salvá-lo.

Mas essa não foi sua pergunta, então vamos fingir que você está usando cat como seu editor, e o arquivo ainda está aberto:

% cat >the_file.txt
Hello world!
^Z
zsh: suspended  cat > the_file.txt
% rm the_file.txt 
% ls -l the_file.txt
ls: cannot access the_file.txt: No such file or directory

Você pode usar lsof -n para ver todos os arquivos abertos e grep para pesquisar seu nome de arquivo.

% lsof -n | grep the_file.txt
cat  2145  elmicha  1w  REG  9,1  13 108003357 /home/elmicha/tmp/the_file.txt (deleted)

Na segunda coluna você pode ver o PID do seu comando cat . Você pode mudar para o diretório correspondente no sistema de arquivos / proc e para o subdiretório fd (descritor de arquivo):

% cd /proc/2145/fd
% ls -l
total 0
lrwx------ 1 elmicha elmicha 64 2012-11-07 00:22 0 -> /dev/pts/4
l-wx------ 1 elmicha elmicha 64 2012-11-07 00:22 1 -> /home/elmicha/tmp/the_file.txt (deleted)
lr-x------ 1 elmicha elmicha 64 2012-11-07 00:22 15 -> /proc/4501/auxv
lrwx------ 1 elmicha elmicha 64 2012-11-07 00:22 2 -> /dev/pts/4

Agora você pode simplesmente copiar o "arquivo" 1 para outro arquivo:

% cp 1 ~/tmp/the_old_file.txt

E veja, está aí:

% cat ~/tmp/the_old_file.txt
Hello world!
    
por elmicha 07.11.2012 / 00:30
0

Salve o arquivo no editor de texto. Deve funcionar muito bem.

A propósito, muitas vezes você é avisado com uma mensagem »deixar não salvo?«, quando você ainda tem o arquivo aberto em um editor e tenta fechar a janela, porque o texteditor também percebe que o arquivo foi excluído e está atualmente "não salvo" (pelo menos nesse local).

(nitstorm, por favor, não use os comentários para respostas;)

    
por wolfv 07.11.2012 / 00:27