Un substitut sûr pour OS X `rm`?

9

J'ai l'habitude de devoir rmalias quelque chose de plus sûr.

J'utilise osx-trash, mais une fois que je suis passé à Ruby 1.9.2, cela ne fonctionne plus.

Je connais trash-cliPython, mais je préférerais de loin quelque chose qui déplace les fichiers vers le dossier Corbeille sous OS X plutôt qu'un autre répertoire.

Quelqu'un at-il une bonne solution?

disparu
la source
9
S'il vous plaît, ne vous habituez pas à un alias rm, mais plutôt vous y habituer mv files/to/be/deleted ~/.Trash. Il est sûr et cohérent sur tous les systèmes.
Asmus
Asmus: Vous voyez que cela ne fonctionne que si votre mac n'a qu'une seule partition. Si vous avez une autre partition, passer à ~ / .Trash n'est pas vraiment correct (ma ~ partition n'est pas assez grande).
disparu le
1
Eh bien, vous auriez dû mentionner dans votre question que vous avez plusieurs partitions!
slhck
1
disparu: eh bien, je pense que mvc'est toujours votre pari le plus sûr. Vous pouvez facilement créer un nouveau dossier sur votre autre partition appelée Trash(ou comme vous l'aimez), puis mvles fichiers là-bas. Une fois que vous êtes sûr qu'ils peuvent être supprimés, supprimez et recréez ce dossier complet.
Asmus
puis vous pouvez simplement avoir ~ / .Trash être un lien logiciel vers le dossier Corbeille sur la partition qui a suffisamment d'espace
AlcubierreDrive

Réponses:

8

Pour OSX, vous pouvez utiliser safe-rm

brew install safe-rm

Vous devez faire une étape supplémentaire pour la préférer à la valeur par défaut rm- ajoutez un lien symbolique.

echo $PATH

Pour moi, j'ai d' /usr/local/bin:abord le même dir que l' safe-rminstallation

Ajouter un lien symbolique vers safe-rm

ln -s /usr/local/bin/safe-rm /usr/local/bin/rm

Pour supprimer et restaurer la valeur par défaut, rmvous pouvez supprimer le lien symboliquerm /usr/local/bin/rm

Le fichier de configuration peut être ajouté à /etc/safe-rm.conf

par exemple:

/private
/Applications
/Developer
/Library
/Network
/System
/Users
/Volumes
/test

Tester avec rm -rf /testlui refusera la suppression desafe-rm.conf

David Thomas
la source
pourrait être bon d'ajouter également /à la liste des chemins qui ne devraient pas être supprimés pour empêcher rm classique -fr /
Mikael Lepistö
3

hasseg.org/trash est un utilitaire Objective-C comme osx-trash .

J'ai écrit une fonction shell qui n'écrase pas les fichiers comme le mv * ~/.Trashferait. Cependant, il déplace toujours les éléments vers le volume de démarrage.

trash() {
    for f in "$@"; do
        bn=$(basename "$f")
        while [ -e ~/.Trash/"$bn" ]; do
            bn="$bn $(date +%H.%M.%S %p)"
        done
        mv "$f" ~/.Trash/"$bn"
    done
}
Lri
la source
Oui, j'ai plus d'une partition et je voudrais conserver les fichiers supprimés dans la même partition plutôt que de les déplacer
disparue le
J'ai ajouté des liens vers deux autres utilitaires et une autre fonction. Chacun d'eux doit conserver les fichiers sur la même partition.
Lri
2

Introduction (vous pouvez l'ignorer)

Pour moi, ce rm -iserait suffisant, car cela vous invite à supprimer tout fichier. Cependant, une sécurité supplémentaire fournie par safe-rmn'est pas une mauvaise idée du tout.

Un simple aliascomme rm=safe-rm -i pourrait suffire, mais rm -rfne fonctionnerait pas, car il -iest annulé par -f.

Donc, nous devons nous assurer que cela -ivient toujours après -f!


Ma solution (3 étapes):

  • Installez safe-rm: brew install safe-rm

    Vous pouvez toujours travailler avec rm, mais vous avez modifié le RM_BINà l'étape suivante

  • Modifiez votre ~/.profile(ou bash_profile ou autre), et mettez l'extrait de code suivant, (qui contient un aliaset un function):

    alias rm="rm_i"
    
    function rm_i(){
    RM_BIN=safe-rm # you can replace it with regular rm if you like
    
    args=""
    files=""
    argsDone=0 # to make sure arguments are before the files
    
    for var in "$@"
    do
        if [[ $var == \-* ]] ; then
            if [ $argsDone -eq 1 ] ; then
                $RM_BIN # just to show the usage of rm
                return
            fi
            args+=" $var"
        else
            argsDone=1
            files+=" $var"
        fi
    done
    
    args+=" -i" # Put -i at the end (so rm -rf will not ignore it)
    
    $RM_BIN $args $files
    }
    
  • Enfin , logoutet login, les mises à jour du .profile sont donc appliquées. NE L'UTILISEZ PAS avant une déconnexion / connexion!


Remarques:

  • Il peut être appliqué à n'importe quelle distribution Linux, avec de légères modifications.
  • Cela ne déplace PAS votre personnel au thrash. Il vous demande juste avant de supprimer chaque fichier!
  • Cela fonctionne avec -rfet avec des expressions rationnelles.
  • Si vous voulez vraiment utiliser rm -rf SANS être invité pour chaque fichier / dossier, vous pouvez toujours l'utiliser /bin/rm -rf(ou safe-rm -rfsi vous l'avez installé).
  • Pas plus involontaire rm -rf ou rm * ;)
Paschalis
la source