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

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 {} +
cuonglm
источник
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и удалить его там.

Cyker
источник