web-dev-qa-db-fra.com

Comment puis-je empêcher l'exécution accidentelle de la commande rm -r *?

Parfois, j'utilise la commande pour supprimer certains fichiers. Par exemple, le nom peut commencer par 'a', je vais donc supprimer avec la commande rm -r a*, mais je ne veux pas supprimer un autre répertoire par accident. Comment verrouiller un répertoire pour empêcher sa suppression par rm -r?

7
john

Vous pouvez aliaser la commande rm en rm -i dans votre shell. Il vous demandera donc de confirmer votre fichier.

Cependant, certains considèrent que cela est nocif. Voir alias rm = “rm -i” considéré comme dangereux? sur Superuser.com

D'autres pensées sont dans Comment puis-je prévenir les rm accidentels -rf /? * sur StackOverflow.com.

5
gertvdijk

Le meilleur conseil est de craindre et de respecter les commandes 'rm -r' ou 'rm -rf' suffisamment pour que, lorsque vous les tapez, vous vous arrêtez et avancez lentement et avec prudence (relisez attentivement la commande plusieurs fois). . Les commandes sont utiles et doivent parfois être utilisées - mais ce n’est pas une bonne idée de tromper le système pour qu’il vous sauve de ce type d’erreur; ce n'est pas une bonne idée de s'habituer à de telles solutions - envisagez de créer de bonnes habitudes qui peuvent être transportées d'une machine à l'autre.

2
Daniel

Si vous essayez de supprimer des éléments de manière sélective, vous pouvez utiliser find.

find . -name "a*" \! -type d -delete

Vous pouvez vérifier ce que vous supprimez en lançant:

find . -name "a*" \! -type d -print

Par exemple, créez quelques répertoires et fichiers:

mkdir -p testDir/a/b 
cd testDir
touch Apple.txt banana.txt ant.tx a/antelope.txt a/bus.txt a/b/apostrophe.txt a/b/bug.txt

Pour voir les fichiers et les répertoires:

find . -name "*" -print

résultats:

.
./a
./a/antelope.txt
./a/b
./a/b/apostrophe.txt
./a/bus.txt
./ant.tx
./Apple.txt
./banana.txt

Pour vérifier ce qui est en train d'être supprimé:

find . -name "a*" \! -type d -print

résultats:

./a/antelope.txt
./a/b/apostrophe.txt
./ant.tx
./Apple.txt

Pour supprimer les fichiers:

find . -name "a*" \! -type d -delete

Pour vérifier que seuls les fichiers * ont été supprimés:

find . -name "*" -print

résultats:

.
./a
./a/b
./a/bus.txt
./banana.txt
1
mmorris

En plus des autres réponses ici, je vous recommande d'utiliser plus de complétion de tabulation et moins globbing. D'après votre question, il semble que vous essayez de supprimer un seul fichier mais que vous ne voulez pas taper le nom complet. Dans ce cas, au lieu de *, vous devriez appuyer sur Tab. La complétion par tabulation est beaucoup plus sûre.

Si vous avez réellement l'intention de supprimer plusieurs fichiers dont le nom correspond à un glob, le meilleur moyen, comme cela a déjà été souligné, est de réfléchir à deux fois avant de cliquer sur entrer. En outre, vous pouvez gagner beaucoup de tranquillité d'esprit si vous utilisez une solution de sauvegarde qui sauvegarde toutes les modifications au fur et à mesure que vous les apportez, afin de pouvoir toujours restaurer toute erreur sans risque de perte de données.

1
Scott Severance