Avons-nous une annulation sous Linux?

Réponses:

53

Linux (comme les autres unices) ne fournit pas nativement de fonctionnalité d'annulation. La philosophie est que si c'est parti, c'est parti. Si c'était important, il aurait dû être sauvegardé.

Il existe un système de fichiers fusible qui conserve automatiquement les copies des anciennes versions: copyfs , disponible dans toutes les bonnes distributions. Bien sûr, cela peut utiliser beaucoup de ressources.

Le meilleur moyen de se protéger contre de tels accidents est d'utiliser un système de contrôle de version (CVS, Bazar, Darcs, Git, Mercurial, Subversion, ...). Il faut un peu de temps pour apprendre, mais cela porte ses fruits à moyen et long terme.

Gilles, arrête de faire le mal
la source
1
bonne alternative pourrait être gitfs, qui est en cours de développement
test30
1
Eh bien, si vous supprimez ou écrasez accidentellement un fichier que vous n'avez pas encore programmé ni
validé,
14

Malheureusement non.

post-futuriste
la source
19
Je ne sais pas si je considère cela malheureux ... Il faudrait beaucoup de ressources pour mettre en œuvre une annulation. Je n'aime même pas l' -ioption rmactivée par défaut. Mes systèmes Unix ne doivent pas me tenir la main.
xenoterracide
5
-i est activé par défaut?! pas ma distribution, non monsieur!
Stefan
9

Non, il n'y a pas d'annulation magique dans Unix. Unix suppose que vous savez ce que vous faites. Pour le support d'annulation, utilisez un VCS (votre éditeur de texte l'a probablement aussi intégré).

La plupart des systèmes de fichiers n'ont pas la capacité de le faire de manière transparente.

Time Machine et la restauration du système sous Mac et Windows, respectivement, ne sont que des systèmes de contrôle de sauvegarde / modification.

xénoterracide
la source
7

Il n'y a pas d'annulation dans la ligne de commande. Vous pouvez cependant exécuter des commandes en tant que rm -iet mv -i. Cela vous demandera avec un "êtes-vous sûr?" question avant qu'ils exécutent la commande.

Il est également possible d'ajouter un alias à un script de démarrage (par exemple ~/.bashrcou /etc/bash.bashrc):

alias remove='rm -i'
alias move='mv -i'

Edit: par les suggestions ci-dessous, j'ai retiré mon conseil d'aliaser les commandes par défaut. Au lieu de cela, il introduit de nouvelles commandes maintenant).

vdboor
la source
1
+1 juste pour ajouter ici. Après avoir défini les alias ci-dessus si, dans certains cas, vous souhaitez simplement supprimer directement sans invite "Êtes-vous sûr", vous pouvez utiliser \ rm et \ mv pour contourner un alias. vous pouvez également utiliser l'option -f.
Hemant
2
mv -idemande uniquement quand il écraserait un fichier (ce qui le rend utile et non odieux). Dans la même veine, alias cp='cp -i'.
Gilles 'SO- arrête d'être méchant'
8
Aliasing rm et mv est une très mauvaise idée. (rm est pire de tout.) Ne prenez jamais l’habitude d’utiliser rm pour signifier rm -i - vous l’utiliseriez éventuellement à un endroit où le pseudonyme n’est pas défini et vous supprimez quelque chose pour de bon. Si vous aimez y être invité, prenez l’habitude d’utiliser rm -i tout le temps.
msakr
Si vous aimez être invité, utilisez un alias sous un nom différent. J'utilise move = 'mv -i', copy = 'cp -i', symlink = 'ln -si', et j'installe une commande corbeille à utiliser à la place de rm. J'utilise toujours mv, cp et rm directement lors de la création de scripts, mais pour une utilisation interactive, ces alias sont pratiques.
@mahmoudsakr Vous avez tout à fait raison, j'ai raté ce point. Je n'ai pas ces commandes alias non plus. Les aliaser comme une commande différente semble être l'option la plus saine!
vdboor
4

La raison pour laquelle les systèmes Linux / Unix n’ont pas de suppression permanente vient de la manière dont la plupart des systèmes de fichiers stockent leurs informations. Les méta-informations de fichier sont toutes stockées à l'avant du disque avec des références à des inodes sur le reste du disque. Généralement, la plupart des systèmes de fichiers allouent 10 blocs à un fichier de cette méta-zone. Les 7 premiers font référence aux 7 premiers inodes. Les 8ème et 9ème vont à des listes d'inodes (blocs à double liaison) et le 10ème à une liste de listes de listes (à trois blocs liés). Cela varie d'un système de fichiers à l'autre (ext4, jfs, xfs, etc.), mais ces listes de blocs peuvent généralement traiter des fichiers dont la taille varie de 2 Go à plusieurs To.

Mais comme toutes ces informations sont stockées à l'avant du disque, lorsqu'un fichier est effacé, il est impossible de référencer les inodes sur le disque à quelles méta-données elles appartiennent. En revanche, FAT32 et NTFS stockent certaines informations d'en-tête avec les fichiers eux-mêmes, ce qui facilite l'identification du fichier auquel un ensemble de blocs doit appartenir (tant que cet espace n'a pas encore été récupéré). Dans le travail Linux, lorsque vous supprimez quelque chose, c’est presque toujours la première chose à être immédiatement écrasée par de nouvelles données pour plus d’efficacité.

djsumdog
la source
2

Si vous voulez vraiment une fonction d'annulation, utilisez le contrôle de source. En fait, Subversion fonctionne très bien sur une machine à utilisateur unique. Je l'utilise pour contrôler tous mes fichiers personnels sur mon système domestique. Cela ressemble à une surdose, jusqu’au désastre, un script malicieux ou une faute de frappe en ligne de commande.

Stephen Jazdzewski
la source
1
Cela ne vous protégera pas de rm -r .bien. ;)
Umang
1
@ Umang, je l'ai déjà fait une fois avec git, où je garde un dépôt local et accidentellement rm -r project.git. Heureusement, si vous gardez une autre version sur un serveur distant qui risque de ne pas arriver
phunehehe
1
@phunehehe et tous ceux qui ont répondu +1 à mon commentaire: nous sommes trop habitués au DVCS pour comprendre que je me trompais complètement. SVN s’engage dans le référentiel (qui n’est pas la branche). Donc, vous serez réellement protégé rm -r .. Vraiment bête de moi.
Umang
2

Une chose que j'aime ajouter à mon .bashrc est une fonction de copie et de suppression. Quelque chose comme:

cprm(){
    cp -p $1 ~/deleted/$1
    rm $1
}

Mais vous devez prendre l’habitude de taper cprm not rm.

Évidemment, vous devrez rester au-dessus de la zone supprimée si votre espace disque est limité.


la source
4
vous pourriez vraiment raccourcir cela à mv $ 1 ~ / supprimé / $ 1
Stefan
oui, et il écrasera un fichier « nouveau document 1 » avec un autre « nouveau document 1 », si vous obtenez le droit de citer: "$1".
utilisateur inconnu
@userunknown: voulez-vous dire $ 1 dans le code de Deano et le code de Stefan doit être cité comme "$ 1"?
Tim
@ Tim: Oui, je le fais.
utilisateur inconnu
Pourquoi ne pas déplacer plutôt que cp et rm?
user1559897