A resposta é "Provavelmente sim, mas depende do tipo de sistema de arquivos e do tempo".
Nenhum desses três exemplos sobrescreverá os blocos de dados físicos de old_file ou existing_file, exceto por acaso.
-
mv new_file old_file
. Isso irá desvincular o old_file. Se houver hard links adicionais para old_file, os blocos permanecerão inalterados nos links restantes. Caso contrário, os blocos geralmente (dependendo do tipo de sistema de arquivos) serão colocados em uma lista livre. Em seguida, se omv
exigir cópia (ao contrário de apenas mover entradas de diretório), novos blocos serão alocados comomv
gravações.Esses blocos recém-alocados podem ou não ser os mesmos que foram liberados . Em sistemas de arquivos como o UFS , blocos são alocados, se possível, a partir do mesmo grupo de cilindros que o diretório no qual o arquivo foi criado. Portanto, há uma chance de que desvincular um arquivo de um diretório e criar um arquivo nesse mesmo diretório reutilize (e sobrescreva) alguns dos mesmos blocos que foram liberados. É por isso que o conselho padrão para as pessoas que acidentalmente removem um arquivo é não gravar novos dados em arquivos em sua árvore de diretórios (e preferencialmente não em todo o sistema de arquivos) até que alguém possa tentar recuperar arquivos.
-
cp new_file old_file
fará o seguinte (você pode usarstrace
para ver as chamadas do sistema):open("old_file", O_WRONLY|O_TRUNC) = 4
O sinalizador O_TRUNC fará com que todos os blocos de dados sejam liberados, assim como
mv
fez acima. E como acima, eles geralmente serão adicionados a uma lista livre e podem ou não ser reutilizados pelas gravações subseqüentes feitas pelo comandocp
. -
vi existing_file
. Sevi
for realmentevim
, o comando:x
fará o seguinte:unlink("existing_file~") = -1 ENOENT (No such file or directory)
rename("existing_file", "existing_file~") = 0
open("existing_file", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 3
Por isso, nem remove os dados antigos; os dados são preservados em um arquivo de backup.
No FreeBSD,
vi
fazopen("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
, que terá a mesma semântica decp
, acima.
Você pode recuperar alguns ou todos os dados sem programas especiais; tudo o que você precisa é de grep
e dd
e acesso ao dispositivo bruto.
Para pequenos arquivos de texto, o único comando grep
na resposta de @Steven D na pergunta você vinculou é a maneira mais fácil:
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
Mas, para arquivos maiores que podem estar em vários blocos não contíguos, eu faço isso:
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
que lhe dará o deslocamento em bytes da linha correspondente. Siga isso com uma série de comandos dd
, começando com
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
Você também gostaria de ler alguns blocos antes e depois desse bloco. No UFS, os blocos de arquivos são geralmente de 8 KB e são geralmente alocados de forma razoavelmente contígua, blocos de um único arquivo sendo intercalados alternadamente com blocos de 8 KB de outros arquivos ou espaço livre. A cauda de um arquivo no UFS é de até 7 fragmentos de 1 KB, que podem ou não ser contíguos.
Naturalmente, em sistemas de arquivos que compactam ou criptografam dados, a recuperação pode não ser tão simples.
Na verdade, existem muito poucos utilitários no Unix que sobrescrevem os blocos de dados de um arquivo existente. Um que vem à mente é dd conv=notrunc
. Outro é shred
.