Como excluir um arquivo com um nome estranho?

33

Eu escrevi um programa que usa a função de mapeamento de memória POSIX ( mmap)

O programa pega um arquivo ( a.dat) e a mapeia na memória para leitura / gravação.

Devido a erros no programa, toda vez que executo o programa, um arquivo com alguns nomes estranhos (por exemplo, ?d?P?^z??d?P?^z?) é criado. O erro foi resolvido, mas não consigo excluir os arquivos.

Não consigo excluí-lo usando a linha de comando ou selecionando / excluindo do gerenciador de janelas.

Então, como devo excluí-lo? Estou usando o Ubuntu 11.04.

AK
fonte
1
Mesmo que você não possa digitar facilmente o nome do arquivo, excluí-lo de um gerenciador de arquivos gráfico deve funcionar bem. que erro você está tendo?
Thomas
2
@ Aditya, não tenho problema em excluir esses arquivos da linha de comando ao escapar seus nomes com aspas simples ( rm '?d?P?^z??d?P?^z?'). Você tentou isso?
Frédéric Hamidi
excluir do gerenciador de janelas gráficas diz apenas que não é possível excluir o arquivo 'filename'. @ Frédéric Hamidi Obrigado por me ajudar a excluir um arquivo. Mas o outro com o nome '? M? P ???)? M? P ???)' não está sendo excluído ... A mensagem de erro diz "rm: não é possível remover`? M? P ???)? M ? P ???) ': Esse arquivo ou diretório não
existe
1
@Aditya, esse outro arquivo deve ter caracteres não imprimíveis em seu nome. Tente as seguintes etapas: 1 / Mova todos os arquivos válidos para fora dessa pasta, 2 / Issue rm *dentro da pasta.
Frédéric Hamidi
1
Ao digitar o nome do arquivo, tente começar com aspas e use o preenchimento automático assim que funcionar (após um ou dois caracteres). O preenchimento automático pressionaria a tecla [tab] para que o shell complete automaticamente o nome. Dessa forma, você poderá ter mais sucesso para escapar corretamente dos nomes.

Respostas:

45

rm -i -- *solicitará que você exclua cada arquivo. Você pode e deve alterar '*' para uma correspondência mais estreita, se houver muitos arquivos. As --opções de processamento são interrompidas; portanto, um arquivo chamado -dserá removido com rmêxito.

Eu usei isso no passado e funciona até você acertar um personagem especial ou 2 que ele não gosta.

JimR
fonte
1
Isso não funciona para um arquivo chamado -d, por exemplo.
SCO
2
Se ele não funciona para você e, dependendo da sua versão do @SCO rm, você pode fazer rm -i -- * A --conta algumas versões do rm não há mais linha de linha de comando após o --e tratar mais argumentos como nomes de arquivos.
JimR
1
Eu acho que essa resposta deve incluir o comentário sugerido por @JimR: Usando --no rmcomando.
Felipe Alvarez
16

você pode usar ls -lipara mostrar todos os arquivos por seu inode. Em seguida, execute este comando para remover o arquivo:

find . -inum ${INODE_NUM} -delete

Eu adicionei -maxdepth 1ao meu achado apenas por segurança:

find . -maxdepth 1 -inum ${INODE_NUM} -delete
Felipe Alvarez
fonte
1
A rigor, ls -ié bom o suficiente.
Scott
lsnão exclui arquivos. OP quer isso.
Felipe Alvarez
4
A primeira linha da sua resposta diz: "você pode usar ls -lipara mostrar todos os arquivos por seu inode". Estou apontando que isso ls -ié bom o suficiente para obter uma lista de nomes de arquivos e seus números de inode correspondentes. (Mas é claro que você precisa ls -iase você quiser incluir dot-files.)
Scott
É melhor simplesmente passar a -deleteopção para find, a fim de minimizar o uso do nome de arquivo errado.
ScumCoder 28/08