Estou tentando remover uma imagem png que foi carregada no meu servidor por meio de um script PHP. Sempre que tento excluí-lo através do ftp e do terminal, recebo o erro
No such file or directory
No entanto, quando estou ls
no diretório, o arquivo é listado e também é listado no meu cliente ftp. Eu tentei criar um arquivo com o mesmo nome e acabei recebendo dois arquivos com o mesmo nome.
Posso abrir o arquivo que supostamente não existe, mas ainda não consigo removê-lo. Eu também tentei reiniciar meu servidor. Alguma idéia de qual pode ser o problema? Estou executando uma versão de 64 bits do Ubuntu, mas não acho que seja um problema de 32/64 bits. Devo também observar que removi muitos outros arquivos png carregados pelo mesmo script PHP.
Saída para ls -l
total 224
-rw-r--r-- 1 www-data www-data 222838 May 13 04:14 qyxdshyikfr_fishing_timeout.png
-rw-r--r-- 1 root root 272 May 14 06:54 upload.php
Saída ao tentar rm
rm: cannot remove ‘qyxdshyikfr_fishing_timeout.png’: No such file or directory
upload.php: http://pastebin.com/z87eypTY
ls -l
do diretório, também o plenorm
comando e sua saída ..rm
comando?unlink
chamada sempre falha ao encontrar um arquivo que não existe. Quando executo essestrace
comando no meu sistema, onde sei que não tenho esse arquivo, ele produz uma saída semelhante; Eu não acho que isso indica que eu tenho um problema no sistema de arquivos! Parece muito mais provável que o nome do arquivo seja ligeiramente diferenteqyxdshyikfr_fishing_timeout.png
e apenas apareça o mesmo devido às limitações na maneirals
como os nomes dos arquivos são exibidos, conforme sugerido em outras respostas.Respostas:
Isso significa que, na ausência de corrupção no sistema de arquivos, você tem dois arquivos com dois nomes diferentes que parecem iguais devido a caracteres não imprimíveis ou caracteres com a mesma aparência no seu conjunto de caracteres / fonte. A
--escape
opção parals
é seu amigo nesses casos, assim como ferramentas comocat -v
.Então também é
rm -i -- *
Leitura adicional
fonte
rm -i -- *
fez o truque.rm -i -- *
comando?-i
solicitará a você antes da remoção de cada arquivo.--
antes*
seleciona todos os arquivos, independentemente de seus nomes incluírem caracteres especiais. Referência: https://explainshell.com/explain?cmd=rm+-i+--+*TL; DR: Execute
ls -1b
, encontre o nome do arquivo, copie a linha na qual ele aparece e forneça-orm
.Como outros sugeriram, provavelmente isso se deve a limitações no caminho -
ls
e alguns outros programas, incluindo software cliente e servidor - lidam com nomes de arquivos estranhos, como os que contêm caracteres de controle, por padrão. Seu sucesso com a resposta do JdeBP sugere fortemente que esse foi o caso, embora já tivesse sido uma boa aposta antes disso.Pois
ls
, quando a saída padrão é um terminal, os?
caracteres são impressos em seu lugar. Portanto, se você não estiverls
direcionando a saída para outro comando (ou redirecionando-a para um log para visualização), provavelmente seu nome de arquivo não contém caracteres de controle. Mas existem outros caracteres problemáticos - talvez o nome do arquivo contenha espaços em branco à direita, por exemplo.Esse comportamento de
ls
pode ser confuso, mas não é um bug, pode ser substituído explicitamente pelo usuário (veja abaixo).Ao tentar acessar ou remover um arquivo remotamente, os erros no software cliente ou servidor podem produzir esses problemas.
Já experimentei esse tipo de coisa
ftp
várias vezes , inclusive para arquivos cujos nomes contêm espaços à direita. (O fato de não ter funcionado ocorreu devido a um erro no meu cliente ftp.) Mesmo quando você mesmo cria um arquivo manualmente, dependendo de como o cria, às vezes é muito fácil inserir inadvertidamente um espaço à direita ou outro espaço em branco que pode parecer espaços, mesmo que não seja.Essa é uma situação em que
ls -1b
(oudir -1
) é útil:-1
dizls
para mostrar uma entrada por linha. Dessa forma, não há confusão sobre onde um nome de arquivo termina e outro começa. Isso é útil para arquivos com nomes estranhos.-b
dizls
para imprimir seqüências de escape para caracteres especiais. A saída dels -b
pode ser copiada e colada literalmente em um comando, sem nenhuma citação adicional : todos os caracteres problemáticos já são citados de uma maneira que faz com que o shell os reconheça como são.Há apenas uma ressalva: se o último caractere de uma linha parece ser
\
, copie um caractere depois disso, pois isso significa\
citar um espaço.Você pode executar
ls -1b
assim, ou pode passar um padrão shell glob para ele (por exemplo,ls -1b qyx*
). O globbing pode ou não encontrar o arquivo, dependendo se os caracteres de controle (ou outros caracteres estranhos) estão presentes na parte do nome que aparece no padrão glob.Após copiar a
\
versão -quoted do nome de arquivo fornecidols
, você pode colá-lo em um comando. Você não precisa modificá-lo manualmente de forma alguma. No seu caso, como você deseja excluir o arquivo, digiterm
, digite um espaço, cole a linha e pressione Enter.Leitura adicional:
ls
: Liste o conteúdo do diretório no manual de referência do GNU coreutils .ls
(edir
) exibe nomes de arquivos estranhos.fonte
-b
thx =) e +1rm -i -- *
.ls
saída da pergunta, mas só pode ser visto no modo de texto quando você clica em "editar".Use
find
e verifique a saída:Se o arquivo não for encontrado, reduza
*qyxdshyikfr*
ligeiramente o termo de pesquisa , por exemplo:*qyxds*
ou*fishing*
.Se estiver bem, use
find
o termo de pesquisa na etapa 1 erm
fonte
rm
pelo nome através de um canal defind
paraxargs
, eu recomendo simplesmente usarfind
a-delete
ação de. Tambémsudo
não é necessário. Menos significativamente, sugiro omitir,-type f
exceto quando for claramente útil. Presumivelmente, se a entrada que o OP deseja excluir acabou por ser um link simbólico, por exemplo, eles ainda desejam encontrá-lo e ainda desejam excluí-lo. A-delete
ação não recursivamente derruba um diretório; nem o seurm
comando, uma vez que você não tem-r
. Portanto, você não irá acidentalmente bater uma pasta inteira (não vazia) aqui por não usar-type
.find ... -delete
diz "não é possível excluir ... Esse arquivo ou diretório"Repostando em detalhes, expandido do meu comentário sobre a resposta de Eliah
O problema é invisível, mas pode ser visto se você souber o que procurar: O nome do arquivo inclui um espaço no final. Como você copiou / colou toda a
ls
saída, isso pode ser visto na pergunta se você destacar a saída, ou editar a postagem e mover o cursor até o fim, ou (como Eliah apontou) examinar o diff no histórico de edições. Eu destaquei als
saída no post nesta captura de tela:Uma pequena e rápida sessão de terminal para duplicar o problema, com comentários:
Usar o preenchimento de guias também evitaria completamente o problema aqui, pois o bash é inteligente o suficiente para escapar dos espaços corretamente (também é um bom hábito, em geral, acelera muito os caminhos de digitação) .
Por exemplo, se eu tivesse digitado
rm f<tab>
, ele seria preenchido automaticamenterm foo\<space><space>
, como no último exemplo no bloco de código acima.fonte
ls
saída porque algo semelhante aconteceu no StackOverflow uma vez (e é a razão pela qual pensei em procurar isso): alguém tem um caractere não imprimível em seu código e a única razão pela qual alguém descobriu isso é porque esse usuário também copiar / colar em vez de re-digitando seu código ao postar a perguntauma vez, criei um arquivo para abrir o Nautilus como root, mas o nome do arquivo ao ver no nautilus era "File Browser (root)" e, em seguida, quando tentei remover como
a única resposta que recebi foi: "rm: não é possível remover 'File Browser (Root) .desktop': esse arquivo ou diretório não existe"
então quando eu corro:
vi / lembrei que o nome do arquivo era "Nautilus-root.desktop"
então eu corro:
trabalhou para mim, espero que ajude!
fonte
Então, eu tive esse problema e nenhuma dessas coisas funcionou para mim. O que funcionou foi a criação de um arquivo com o mesmo nome. Era uma pasta chamada Example.1.2.3, então criei uma nova pasta e a nomeei exatamente como a que não excluiria. A pasta antiga desapareceu e eu apaguei a nova.
fonte
Eu tive uma situação semelhante, depois de usar
rsync
para fazer backup do meu diretório Pictures em um Mac e lê-lo no Ubuntu. Havia dois arquivos (na verdade diretórios) com nomes diferentes, mas com o mesmo conteúdo. Excluí um no Lixo (usando o Nautilus), mas não consegui excluir o outro, mesmo na linha de comando. Diria:Após verificar os números de inode com ls -i -l, verificou-se que os dois diretórios têm o mesmo número de inode. Parece um link rígido ...
A solução foi surpreendentemente simples - esvazie a lixeira clicando com o botão direito do mouse no ícone. Depois disso, os dois diretórios sumiram.
fonte