Jak mogę usunąć plik o nazwie „>”?


22

Uruchomiłem skrypt w języku Python, który źle działał i użył go sudodo utworzenia pliku o nazwie >.

Jak mogę pozbyć się tego pliku?

Oczywiście, kiedy próbuję, pojawia sudo rm >się błąd bash: syntax error near unexpected token 'newline', ponieważ wydaje się, że próbuję przekierować wyjście rm.

Jego uprawnienia to -rw-r--r--.


10
Odpowiedzi są oczywiście słuszne, ale ogólnie można rozważyć to: w jaki sposób utworzono plik? (Oczywiście, sudo touch >w powłoce dałby ten sam błąd.) Powiedziałeś, że to ze skryptem Pythona, prawdopodobnie utworzonym przez przekazanie ">"do jakiejś osfunkcji. Więc sudo python <<< 'import os; os.remove(">")'powinno działać dobrze.
wchargin

4
Przypomniało mi to jeden błąd w systemie Windows, w którym dosłownie nie można było usunąć pliku o określonej nazwie (ale nie było problemu z jego utworzeniem.)
PyRulez

PyRulez ooh, który?
Austin Burk

8
Jak na ironię odpowiedź znajduje się w tytule, który sam napisałeś.
Raphael

Odpowiedzi:


54

Każdy z nich powinien działać:

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

Zauważ, że dwa ostatnie polecenia, które używają find, znajdą wszystkie pliki lub katalogi wymienione >w bieżącym folderze i wszystkich jego podfolderach. Aby tego uniknąć, użyj GNU find:

sudo find . -maxdepth 1 -name '>' -delete
sudo find . -maxdepth 1 -name '>' -exec rm {} +

2
Prawdopodobnie warto zauważyć, że findtak nie jest, rmponieważ jest rekurencyjne i usunie każdy plik nazwany rmw bieżącym drzewie katalogów, bez względu na to, jak głęboko.
jw013

6
@rahul Pierwsze trzy ( rmwarianty) są takie same. To tylko trzy różne sposoby ochrony tej nazwy pliku przed powłoką. Naprawdę nie ma powodu, aby preferować jeden od drugiego.
derobert

7
Dlaczego pan proponuje find(1)? Jedyny problem polega na tym, że należy podać metaznak powłoki. Istnieje milion i jeden różnych programów, które mogą usunąć plik, ale użycie czegoś innego niż rm(1)tylko zaciemnia odpowiedź.
camh

2
Nie potrzebujesz GNU find, aby uniknąć powtarzania się. sudo find . ! -name . -prune -name '>' -exec rm {} +.
hvd

2
Zgadzam się z @camh, findnie dodaje nic za odpowiedź na zadane pytanie.
Paul Draper,

18

Możesz także użyć Pythona, aby go usunąć:

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

Z POSIX find:

find . ! -name . -prune -type f -name '>' -exec rm -f {} +

3
Po co się męczyć? Powłoka zapewnia wiele sposobów uniknięcia interpretacji >jako przekierowania danych wyjściowych.
Alexis

3
@alexis imo najlepiej znać jak najwięcej sposobów wykonywania tych prostych zadań. jeśli operacja ma inny taki problem, który jest trudniejszy do rozwiązania wyłącznie za pomocą powłoki, będą mieli inne narzędzie w swoim zestawie narzędzi, aby spróbować
undergroundmonorail

1

To, co skończyłem na początku, działa również:

sudo sh -c "rm \>"

Jest to oczywiście wariant prostszy sudo rm \>.


0

Próbowałem tego jako komentarz, ale wyszło to w jednym wierszu

[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]~% 

To już jest odpowiedź Terdona ...
John WH Smith

Tak, jest częściowo podany w odpowiedzi na ścięgno, zgadzam się, po prostu pomyślałem, że ta sekwencja jest prosta i wyraźnie ją wyraziłem. Jak się przekonacie, starałem się zamieścić to w komentarzu, a nie w odpowiedzi, ale nie wiem, jak tego uniknąć w jednym wierszu. Pokazuje również, że nie potrzebujesz Pythona do utworzenia pliku, inny punkt zasugerowano również w innych komentarzach.
Harry Weston,

0

Cytuj znak, aby nie był interpretowany przez powłokę jako przekierowanie:

sudo rm '>'

Jeśli jednak masz inne pliki z dziwnymi znakami, najbezpieczniejszą metodą jest otwarcie eksploratora plików GUI, np. nautilusUsunięcie go.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.