Як я можу видалити файл з назвою ">"?


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 ooh, який?
Остін Берк

8
Як не дивно, відповідь - у назві, яку ви написали самі.
Рафаель

Відповіді:


54

Будь-який із них повинен працювати:

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

Зауважте, що останні дві команди, ті, що використовують find, знайдуть усі файли чи каталоги, названі >в поточній папці, та всі її папки. Щоб уникнути цього, використовуйте пошук GNU:

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)це просто оскаржувати відповідь.
кем

2
Вам не потрібно знаходити GNU, щоб уникнути повторення. 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
Навіщо турбуватися? Оболонка пропонує безліч способів уникнути інтерпретації >як перенаправлення виводу.
alexis

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

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.