De alguma forma, consegui criar um arquivo que parece não ter um nome de arquivo. Encontrei algumas informações sobre como obter mais detalhes do arquivo no seguinte segmento.
No entanto, tentei algumas das sugestões listadas e não consigo excluir o arquivo. Não sei ao certo o que fiz para criá-lo, mas aconteceu ao tentar copiar um arquivo xml.
Algumas informações sobre o arquivo são as seguintes;
> ls -lb
total 296
-rw-r--r-- 1 voyager endeavor 137627 Jan 12 12:49 \177
> file *
: XML document
> ls -i
417777
Tentei encontrar usando o interruptor inum e depois canalizá-lo para que parecesse a maneira mais infalível de se livrar dele. No entanto, o exemplo dado na parte inferior do segmento vinculado abaixo falhou para mim. O exemplo foi:
> find -inum 41777 -exec ls -al {} \;
find: illegal option -- i
find: [-H | -L] path-list predicate-list
então tentei usar a lista de caminhos primeiro, como a seguir, mas isso também não funcionou:
> find . -inum 41777 -exec ls -al {} \;
Não sei ao certo qual é o caractere não imprimível \ 177 ou como posso passar isso para um rm
comando, mas quero ter certeza de que não vou estragar nenhum outro arquivo / diretório na minha tentativa de excluir esse arquivo.
fonte
\177
é oDEL
caractere ASCII .0
?Respostas:
O arquivo tem um nome, mas é composto de caracteres não imprimíveis. Se você usa ksh93, bash, zsh, mksh ou FreeBSD sh, você pode tentar removê-lo especificando seu nome não imprimível. Primeiro, verifique se o nome está correto com:
ls -ld $'\177'
Se ele mostra o arquivo certo, use rm:rm $'\177'
Outra abordagem (um pouco mais arriscada) é usar
rm -i -- *
. Com a opção -i, o rm exige confirmação antes de remover um arquivo, para que você possa pular todos os arquivos que deseja manter, exceto aquele.Boa sorte!
fonte
rm -i *
não teria funcionado neste caso; por causa das novas linhas, o shell se expandiria*
para algo querm
não seria reconhecido como o nome do arquivo.bash
e GNUrm
. No meu sistema,rm *
,rm -i *
, erm Ctrl-V DEL TAB ENTER
todo o trabalho corretamente, mesmo que o nome do arquivo contém um caractere de nova linha (eu usei"\177foo\nbar\n"
). Alguns comandos não lidam bem com esses nomes de arquivos, mas as ferramentas GNU parecem robustas; versões não GNU das mesmas ferramentas também podem não se comportar. De qualquer forma, é útil conhecer os vários truques nessas respostas.rm
nunca fará nenhuma forma de divisão de palavras, seja GNUrm
ou não. O shell expande os globs e, quando executa o comando solicitado, passa nos nomes de arquivos resultantes como argumentos separados por nulo (no código C). O que é perigoso é canalizar uma lista de arquivos para algo que use novas linhas como delimitadores; consulte Por que repetir as práticas inadequadas de saída do find?Para aqueles que usam,
vim
execute-o no diretório de trabalho atual:e navegue até o arquivo com as teclas de seta ou
j/k
. Em seguida, pressioneShift+D
e confirme a exclusão comy
.fonte
Provavelmente, existe uma maneira de passar o nome do arquivo
rm
, mas se você estiver preocupado em estragar tudo, poderá usar um gerenciador de arquivos da GUI. O Emacs vem com um modo de edição de diretório que você pode usar se tiver:Abra a pasta em
emacs
. Você pode executaremacs /path/to/folder
ou abrir o emacs, pressionar Esc+ xe executardired
, o que solicitará o caminhohttp://so.mrozekma.com/unix-dired-delete1.png
Vá para a linha com o arquivo que deseja excluir e pressione d. Você deve ver um
D
na margem esquerda ao lado do arquivo:http://so.mrozekma.com/unix-dired-delete2.png
Pressione xpara salvar suas alterações. Ele será solicitado para garantir que você deseja excluir o arquivo; pressione y:
http://so.mrozekma.com/unix-dired-delete3.png
fonte
vim
execute-o no diretório de trabalho atual:vim ./
e navegue até o arquivo com as teclas de seta. Em seguida, pressioneShift+D
e confirme a exclusão comy
.vim
apoiarVocê já demonstrou com
file *
que o shell glob (*
) é capaz de pegar esse arquivo, então agora basta fazer umrm
nesse glob.rm -i *
n
todos os arquivos, exceto aquele com o nome aparentemente invisívelfonte
O arquivo realmente tem um nome, mas é composto de caracteres não imprimíveis.
Um método fácil é confiar na conclusão do shell: pressione Tabrepetidamente até que o nome do arquivo "estranho" seja inserido. Você deve ter seu shell configurado para alternar entre possíveis conclusões:
menu-complete
, que não está vinculado por padrão, e nãocomplete
que está vinculado Tabpor padrão. Como alternativa, use Esc *para inserir conclusões para todos os arquivos e remova os que não deseja excluir da linha de comando.setopt auto_menu
ousetopt menu_complete
definir.Se a conclusão não for útil em seu shell, você poderá ligar
rm -i -- *
e responder "não", exceto para esse arquivo específico. Se o nome do arquivo não começar com um caractere imprimível, você poderá restringir as correspondências a arquivos cujo primeiro caractere não esteja em um conjunto de caracteres imprimíveis:(Cuidado se seu padrão pode corresponder a um arquivo chamado
-f
, querm
seria tratado como uma opção.)Outro método é chamar
ls -i
para localizar o inode do arquivo (um inode identifica exclusivamente um arquivo em um determinado sistema de arquivos) e depoisfind -inum
operar nesse arquivo específico. Este método é útil principalmente quando o diretório contém muitos arquivos.Se o seu
find
não tiver uma-delete
opção, ligue pararm
:(Sim, eu sei que a maior parte disso já foi publicada. Mas as respostas com as informações relevantes estão tornando isso mais complicado do que deveria ser.)
fonte
Tente usar
echo -e
para obter o personagem\177
e depoisxargs
passá-lo pararm
.Acontece queecho
não usa escapes decimais, então converta para hex:177
é octal;echo
requer um\0
(literal, não nulo byte) antes:fonte
\xb1
é decimal177
,\0
nula-o e-0
dizxargs
para usar um nome nulo-terminado em vez de um nome terminado por nova linha.echo
, como está, envia 2 nomes de arquivos para xargs e depois pararm
... o segundo nome de arquivo é\n
.. Isso resulta em um erro ou na exclusão de um arquivo com esse nome ('\ n')-n
para me livrar da nova linha.Eu posso apenas sobre a garantia que o arquivo não tem um nome. Por acaso é um nome que contém caracteres não imprimíveis.
Se
rm
não funcionou, usar a saída defind
com a-inum
opção como argumentorm
provavelmente não ajudará; só vai passar o mesmo argumento pararm
, com o mesmo problema.O arquivo é o único nesse diretório, certo?
A primeira coisa que eu tentaria é
cd
entrar no diretório, digitarrm ./
e pressionar a tecla Tab. Isso deve expandir o argumento para o nome real do arquivo e o anterior./
deve impedir arm
interpretação do argumento como algo diferente de um nome de arquivo.Outra solução é
cd
acessar o diretório pai e, em seguida, usarrm -r
(ou, se necessáriorm -rf
) no diretório. Isso deve remover o diretório e todo o seu conteúdo, independentemente do nome. Você pode usarmkdir
para recriar o diretório (e talvezchmod
restaurar suas permissões).EDIT:
Analisando sua
ls -lb
saída novamente, acho que o nome do arquivo começa com umDEL
caractere ASCII (que é ruim, não fatal) e contém um ou mais caracteres de nova linha (o que é realmente ruim). Até onde eu sei, orm
comando não pode interpretar uma nova linha como parte de um nome de arquivo.Mas a
unlink()
chamada do sistema pode. Aqui está um script Perl que criei que irá percorrer os arquivos no diretório atual e perguntar a cada um se você deseja removê-lo. Ele não usa um comando externo comorm
para remover os arquivos, portanto, deve ser capaz de lidar com qualquer caractere engraçado suportado pelo sistema de arquivos (qualquer coisa que não seja ASCIINUL
e/
).Fazer
rm -r
ourm -rf
no diretório contendo ainda deve funcionar, mas se você quiser apenas remover um único arquivo, pode tentar isso.(Outra solução, se houver outros arquivos no diretório que você deseja manter, é mover todos os outros arquivos para um diretório temporário, em seguida, nuke e recrie o diretório e mova os outros arquivos de volta.)
(Ah, e o que você fez para criar esse arquivo, tente não fazê-lo novamente!)
fonte
Se você puder encontrar exatamente esse arquivo usando o
find
comando, poderá usar o-delete
predicado. Apenas tome cuidado, e faça-delete
um último parâmetro do comando find ou isso vai doer muito ...fonte
Você está perto. Passo a passo, veja como excluir o arquivo pelo número do inode.
Primeiro, encontre o número do inode do arquivo que você deseja, usando
ls -li
. O número do inode estará na primeira coluna da saída.Por exemplo:
Nesse caso, o número do inode é 311010
Use
find
para procurar o arquivo pelo número do inode.Verifique se
find
retorna apenas o nome do arquivo que você deseja excluir. Por exemplo:Quando tiver a certeza que
find
é encontrar o arquivo certo, em seguida, passar o-delete
parâmetro parafind
. Isso excluirá o arquivo para você.fonte
As outras respostas são ótimas e funcionarão em quase todos os ambientes.
Mas, se houver uma GUI em execução, basta abrir o diretório no nautilus, dolphin, konqueror ou seu gerenciador de arquivos favorito e você poderá ver e excluir facilmente qualquer arquivo que tenha um nome não cooperativo com apenas alguns cliques do mouse .
Se você não é um usuário regular do emacs ou vim (como mostrado em várias outras respostas), esse pode ser o caminho mais fácil.
fonte
Ocorreu um problema semelhante com um arquivo chamado "\ 033" (o caractere "Escape" real).
O texto acima solicitará que você remova os arquivos no diretório atual que não iniciam com uma letra ou número.
fonte
Em vez disso, você pode renomear o diretório atual para
DirX_OLD
, criar um novo diretório com o nomeDirX
e mover todos os arquivos necessários deDirX_OLD
paraDirX
. Após copiar os arquivos, você pode excluirDirX_OLD
fonte
Para o caso de ajudar alguém, vou acrescentar meus dois centavos. Consegui obter o (s) nome (s) do arquivo usando
stat
o curinga assim:Resultado:
Então eu poderia usar seqüências de caracteres C-C citadas ANSI (como usadas na resposta aceita) para acessar os arquivos:
fonte
Todo arquivo tem um nome, você só precisa encontrar exatamente qual.
Vou usar esses arquivos como exemplos:
Esses arquivos serão mostrados como
?
no normalls
:Mas se você
ls
permitir a-Q
opção, deve ficar claro qual é o nome do arquivo real:esses são os números dos inodes e os nomes "Quoted" na
1
coluna dos arquivos em pwd.Isso está usando a habilidade de um shell (POSIX) para usar expansões (globbing):
Para ter os nomes com qualquer caractere não imprimível:
E para listar arquivos que podem ter apenas caracteres não imprimíveis:
Para
-i
removê-los seletivamente (a opção (interativa)), use:Você só precisa escolher quais apagar, respondendo
y
à pergunta acima.fonte
Se você tem um bash com preenchimento automático, isso pode funcionar para você. Digitei o caractere que foi mostrado na lista de diretórios. Em seguida, ativei o preenchimento automático e renomei o item para algo imprimível.
Aqui está o que funcionou para mim:
fonte
trabalhou para mim.
fonte