Comment puis-je supprimer un fichier nommé «>»?

22

J'exécutais un script Python qui fonctionnait mal et utilisé sudopour créer un fichier nommé >.

Comment puis-je me débarrasser de ce fichier?

Bien sûr, lorsque j'essaie sudo rm >, j'obtiens l'erreur bash: syntax error near unexpected token 'newline', car il pense que j'essaie de rediriger la sortie de rm.

Ses autorisations sont -rw-r--r--.

Une personne
la source
10
Les réponses sont correctes, bien sûr, mais en général, vous pourriez considérer ceci: comment le fichier a-t-il été créé en premier lieu? (Bien sûr, sudo touch >un shell donnerait la même erreur.) Vous avez dit que c'était avec un script Python, vraisemblablement créé en passant ">"à une osfonction. Cela sudo python <<< 'import os; os.remove(">")'devrait donc très bien fonctionner.
wchargin
4
Cela m'a rappelé le seul bogue dans Windows où vous ne pouviez littéralement pas supprimer un fichier avec un certain nom (mais il n'y avait aucun problème à le faire.)
PyRulez
PyRulez ooh, lequel?
Austin Burk du
8
Ironiquement, la réponse se trouve dans le titre que vous avez écrit vous-même.
Raphael

Réponses:

54

N'importe lequel de ces éléments devrait fonctionner:

sudo rm \>
sudo rm '>'
sudo rm ">"
sudo find . -name '>' -delete
sudo find . -name '>' -exec rm {} +

Notez que les deux dernières commandes, celles qui utilisent find, trouveront tous les fichiers ou répertoires nommés >dans le dossier actuel et tous ses sous-dossiers. Pour éviter cela, utilisez GNU find:

sudo find . -maxdepth 1 -name '>' -delete
sudo find . -maxdepth 1 -name '>' -exec rm {} +
terdon
la source
2
Il vaut probablement la peine de souligner que ce findn'est pas comme rmparce qu'il est récursif et supprimera tous les fichiers nommés rmsous votre arborescence de répertoires actuelle, quelle que soit la profondeur.
jw013
6
@rahul Les trois premiers (les rmvariantes) sont tous les mêmes. Ce n'est que trois façons différentes de protéger ce nom de fichier du shell. Il n'y a pas vraiment de raison de préférer l'un à l'autre.
derobert
7
Pourquoi suggérez-vous find(1)? Le seul problème ici est qu'un métacaractère shell doit être cité. Il existe des millions et des programmes différents qui peuvent supprimer un fichier, mais utiliser autre chose que rm(1)masquer la réponse.
camh
2
Vous n'avez pas besoin de trouver GNU pour éviter de récidiver. sudo find . ! -name . -prune -name '>' -exec rm {} +.
DVD
2
Je suis d'accord avec @camh, findn'ajoute rien pour répondre à la question posée.
Paul Draper
18

Vous pouvez également utiliser Python pour le supprimer:

python -c 'import os;os.remove(">")'

Avec POSIX find:

find . ! -name . -prune -type f -name '>' -exec rm -f {} +
cuonglm
la source
3
Pourquoi s'embêter? Le shell offre de nombreuses façons d'éviter d'interpréter >la redirection de sortie.
alexis
3
@alexis imo, il est préférable de connaître autant de façons d'accomplir ces tâches simples que possible. si op a un autre problème comme celui-ci qui est plus difficile à résoudre uniquement avec le shell, ils auront un autre outil dans leur boîte à outils pour essayer
undergroundmonorail
1

Ce que j'ai fini par faire au départ fonctionne aussi:

sudo sh -c "rm \>"

C'est, bien sûr, une variante du plus simple sudo rm \>.

Une personne
la source
0

J'ai essayé cela en tant que commentaire, mais tout est sorti sur une seule ligne

[Harry@localhost]~% touch ">"
[Harry@localhost]~% cat > ">"
line 1
line 2
[Harry@localhost]~% cat ">"
line 1
line 2
[Harry@localhost]~% ls -l ">"
-rw-r--r-- 1 Harry Harry 14 Jun  5 12:04 >
[Harry@localhost]~% rm ">"
[Harry@localhost]~% ls -l ">"
ls: cannot access >: No such file or directory
[Harry@localhost]~% 
Harry Weston
la source
C'est déjà dans la réponse de terdon, cependant ...
John WH Smith
Oui, c'est en partie donné dans la réponse du tendon, je suis d'accord, je pensais juste que cette séquence était simple et la rendait explicite. Comme vous le verrez, j'ai essayé de l'inclure sous forme de commentaire plutôt que de réponse, mais je ne sais pas comment éviter que tout ne ressorte sur une seule ligne. Cela montre également que vous n'avez pas besoin de Python pour créer le fichier, un autre point également suggéré dans d'autres commentaires.
Harry Weston
0

Citez le caractère pour qu'il ne soit pas interprété par le shell comme une redirection:

sudo rm '>'

Cependant, si vous avez d'autres fichiers avec des caractères étranges, la méthode la plus sûre consiste à ouvrir un explorateur de fichiers GUI tel que nautiluset à le supprimer.

Cyker
la source