web-dev-qa-db-fra.com

Existe-t-il un moyen de récupérer un fichier que j'ai supprimé mais qui est toujours ouvert quelque part?

Cette question est liée à Comment récupérer des fichiers supprimés? mais elle est de nature légèrement différente.

Supposons que j'ai un fichier nommé ~/something ouvert dans un éditeur de texte. Supposons en outre que j'ouvre un terminal et exécute la commande suivante pendant que le fichier est toujours ouvert dans l'éditeur de texte:

rm ~/something

Cela supprimera le fichier. Supposons maintenant que j'ai changé d'avis et que je voulais récupérer le fichier. Le fichier est toujours ouvert dans l'éditeur de texte, donc il n'a pas encore été supprimé du disque ou du système de fichiers .

Existe-t-il un moyen de le récupérer?

7
Nathan Osman

Je ne sais pas s'il existe des éditeurs de texte qui gardent le fichier ouvert pendant que vous le modifiez. Normalement (c'est-à-dire dans Emacs), le fichier est lu dans un tampon en RAM puis le fichier est fermé. Vous éditez uniquement en RAM. Lorsque vous enregistrez le tampon, le fichier est ouvert, écrit et refermé. Vous pouvez utiliser ps auxw | grep your_editor pour trouver le PID de votre éditeur, puis lsof -p your_PID pour voir les fichiers encore ouverts.

En revanche, si le fichier est toujours dans le tampon de votre éditeur, vous pouvez simplement l'enregistrer.

Mais ce n'était pas votre question, alors supposons que vous utilisez cat comme éditeur, et le fichier est vraiment toujours ouvert:

% 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

Vous pouvez utiliser lsof -n pour voir tous les fichiers ouverts et grep pour rechercher votre nom de fichier.

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

Dans la deuxième colonne, vous pouvez voir le PID de votre commande cat. Vous pouvez passer dans le répertoire correspondant du système de fichiers/proc et dans le sous-répertoire fd (descripteur de fichier):

% 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

Maintenant, vous pouvez simplement copier le "fichier" 1 vers un autre fichier:

% cp 1 ~/tmp/the_old_file.txt

Et voyez, c'est là:

% cat ~/tmp/the_old_file.txt
Hello world!
10
elmicha

Enregistrez simplement le fichier dans l'éditeur de texte. Devrait très bien fonctionner.

Soit dit en passant, vous êtes souvent invité avec un message "laisser non enregistré?", Lorsque vous avez toujours le fichier ouvert dans un éditeur et essayez de fermer la fenêtre, car l'éditeur de texte prend également note que le fichier a été supprimé et est actuellement "non enregistré "(Au moins à cet endroit).

(nitstorm, veuillez ne pas utiliser les commentaires pour les réponses;)

0
wolfv