Как я могу удалить файл с именем «>»?


22

Я запускал скрипт Python, который работал со сбоями и использовал sudoдля создания файла с именем >.

Как я могу избавиться от этого файла?

Конечно, когда я пытаюсь sudo rm >, я получаю ошибку bash: syntax error near unexpected token 'newline', потому что он думает, что я пытаюсь перенаправить вывод rm.

Его разрешения есть -rw-r--r--.


10
Ответы, конечно, верны, но в целом вы могли бы подумать так: как файл был создан в первую очередь? (Конечно, sudo touch >в оболочке выдается та же ошибка.) Вы сказали, что это был скрипт Python, предположительно созданный путем передачи ">"какой-либо osфункции. Так что sudo python <<< 'import os; os.remove(">")'должно работать просто отлично.
wchargin

4
Это напомнило мне об одной ошибке в Windows, когда вы буквально не могли удалить файл с определенным именем (но не было проблем с его созданием.)
PyRulez

PyRulez ооо, что?
Остин Берк

8
По иронии судьбы, ответ в названии вы написали сами.
Рафаэль

Ответы:


54

Любой из них должен работать:

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

Обратите внимание, что последние две команды, которые используют find, найдут все файлы или каталоги, названные >в текущей папке и во всех ее подпапках. Чтобы избежать этого, используйте GNU find:

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

2
Вероятно, стоит указать, что findэто не так, rmпотому что это рекурсивно и удалит каждый файл, указанный rmв вашем текущем дереве каталогов, независимо от его глубины.
jw013

6
@rahul Первые три ( rmварианты) все одинаковы. Это всего лишь три разных способа защитить это имя файла от оболочки. На самом деле нет причин предпочитать одно другому.
Дероберт

7
Почему вы предлагаете find(1)? Единственная проблема здесь заключается в том, что метасимвол оболочки должен быть заключен в кавычки. Существует миллион программ, которые могут удалить файл, но используют что-то, кроме того, rm(1)что просто запутывают ответ.
Camh

2
Вам не нужно GNU find, чтобы избежать повторения. sudo find . ! -name . -prune -name '>' -exec rm {} +,
HVd

2
Я согласен с @camh, findничего не добавляет для ответа на заданный вопрос.
Пол Дрейпер

18

Вы также можете использовать Python, чтобы удалить его:

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

С POSIX find:

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

3
Зачем беспокоиться? Оболочка предоставляет множество способов избежать интерпретации >как перенаправления вывода.
Алексис

3
@alexis imo лучше знать как можно больше способов решения этих простых задач. если у op есть другая проблема, подобная этой, которую сложнее решить просто с помощью оболочки, у них в наборе инструментов будет еще один инструмент, с которым можно попробовать
подземный

1

То, что я делал вначале, тоже работает:

sudo sh -c "rm \>"

Это, конечно, вариант по проще sudo rm \>.


0

Я попробовал это как комментарий, но все вышло на одной строке

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

Это уже в ответе Тердона, хотя ...
Джон У. С. Смит

Да, это частично дано в ответе сухожилия, я согласен, я просто подумал, что эта последовательность проста и сделал его явным. Как вы увидите, я пытался включить его в качестве комментария, а не ответа, но я не знаю, как избежать всего этого в одной строке. Это также показывает, что вам не нужен Python для создания файла, еще один момент, также предложенный в других комментариях.
Гарри Уэстон

0

Процитируйте символ, чтобы он не интерпретировался оболочкой как перенаправление:

sudo rm '>'

Однако, если у вас есть другие файлы со странными символами, самый безопасный способ - открыть проводник GUI-файла, например, nautilusи удалить его там.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.