Como posso excluir um arquivo chamado ">"?

22

Eu estava executando um script Python que funcionou mal e usado sudopara criar um arquivo chamado >.

Como posso me livrar desse arquivo?

Obviamente, quando tento sudo rm >, recebo o erro bash: syntax error near unexpected token 'newline', porque pensa que estou tentando redirecionar a saída de rm.

Suas permissões são -rw-r--r--.

Uma pessoa
fonte
10
As respostas estão corretas, é claro, mas em geral você pode considerar o seguinte: como o arquivo foi criado em primeiro lugar? (É claro que sudo touch >em um shell daria o mesmo erro.) Você disse que estava com um script Python, presumivelmente criado ao passar ">"para alguma osfunção. Então, sudo python <<< 'import os; os.remove(">")'deve funcionar muito bem.
wchargin
4
Isto lembrou-me da um erro no Windows, onde você literalmente não poderia excluir um arquivo com um certo nome (mas não havia nenhum problema de fazer isso.)
PyRulez
PyRulez ooh, qual?
Austin Burk
8
Ironicamente, a resposta está no título que você escreveu.
Raphael

Respostas:

54

Qualquer um destes deve funcionar:

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

Observe que os dois últimos comandos, aqueles que usam find, encontrarão todos os arquivos ou diretórios nomeados >na pasta atual e todas as suas subpastas. Para evitar isso, use o GNU find:

sudo find . -maxdepth 1 -name '>' -delete
sudo find . -maxdepth 1 -name '>' -exec rm {} +
terdon
fonte
2
Provavelmente vale ressaltar que findnão é assim rmporque é recursivo e excluirá todos os arquivos nomeados rmna sua árvore de diretórios atual, não importando a profundidade.
Jw013
6
@rahul Os três primeiros (as rmvariantes) são todos iguais. São apenas três maneiras diferentes de proteger esse nome de arquivo do shell. Não há realmente uma razão para preferir um ao outro.
Derobert 30/05
7
Por que você sugere find(1)? O único problema aqui é que um metacaractere do shell precisa ser citado. Existem um milhão e um programas diferentes que podem remover um arquivo, mas usar algo diferente rm(1)é apenas ofuscar a resposta.
Camh
2
Você não precisa encontrar o GNU para evitar recorrências. sudo find . ! -name . -prune -name '>' -exec rm {} +.
hvd 31/05
2
Concordo com @camh, findnão acrescenta nada para responder à pergunta.
Paul Draper
18

Você também pode usar o Python para removê-lo:

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

Com o POSIX find:

find . ! -name . -prune -type f -name '>' -exec rm -f {} +
cuonglm
fonte
3
Porque se importar? O shell fornece várias maneiras de evitar a interpretação >como redirecionamento de saída.
alexis
3
@alexis imo, é melhor conhecer o maior número possível de maneiras de realizar essas tarefas simples. se op tem um outro problema como este que é mais difícil de resolver puramente com o shell, eles terão mais uma ferramenta em sua caixa de ferramentas para experimentá-lo com
undergroundmonorail
1

O que acabei fazendo inicialmente também funciona:

sudo sh -c "rm \>"

Esta é, obviamente, uma variante do mais simples sudo rm \>.

Uma pessoa
fonte
0

Eu tentei isso como um comentário, mas saiu tudo em uma linha

[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
fonte
Isso já está na resposta de terdon, embora ...
John WH Smith
Sim, em parte, é dada na resposta do tendão, concordo, apenas pensei que essa sequência é simples e a tornou explícita. Como você verá, tentei incluí-lo como comentário e não como resposta, mas não sei como evitar que tudo saia em uma linha. Também mostra que você não precisa do Python para criar o arquivo, outro ponto também sugerido em outros comentários.
Harry Weston
0

Cite o caractere para que ele não seja interpretado pelo shell como um redirecionamento:

sudo rm '>'

No entanto, se você tiver outros arquivos com caracteres estranhos, o método mais seguro é abrir um explorador de arquivos da GUI como nautiluse excluí-lo lá.

Cyker
fonte