“Nenhum tal arquivo ou diretório” ao tentar remover um arquivo, mas o arquivo existe?

14

Estou tentando remover uma imagem png que foi enviada para o meu servidor por meio de um script PHP. Sempre que tento deletá-lo tanto pelo ftp quanto pelo terminal, recebo o erro

No such file or directory

No entanto, quando eu 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.

Eu 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 do que 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. Eu também devo observar que eu removi muitos outros arquivos png enviados 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: link

    
por DevinFrench 14.05.2015 / 13:15

7 respostas

20
  

Eu tentei criar um arquivo com o mesmo nome e acabei recebendo dois arquivos com o mesmo nome.

Isso diz, ausente corrupção do sistema de arquivos, que você tem dois arquivos com dois nomes diferentes que aparecem iguais por causa de caracteres não imprimíveis ou caracteres que parecem iguais em seu conjunto de caracteres / fonte. A opção --escape para ls é seu amigo em tais instâncias, assim como ferramentas como cat -v .

O mesmo acontece com rm -i -- *

Leitura adicional

por JdeBP 14.05.2015 / 13:48
12

TL; DR: Execute ls -1b , localize o nome do arquivo, copie a linha na qual ele aparece e dê isso para rm .

Como outros sugeriram, muito provavelmente isso se deve a limitações na maneira como ls - e alguns outros programas, incluindo software cliente e servidor - manipulam nomes de arquivos estranhos, como os que contêm caracteres de controle, por padrão. O seu sucesso com a resposta do JdeBP sugere strongmente que este era o caso, embora fosse uma boa aposta antes mesmo disso.

  • Para ls , quando saída padrão é um terminal, ? caracteres são impresso em seu lugar. Portanto, se você não estiver enviando a saída de ls para qualquer outro comando (ou redirecionando-o para um log para visualização), provavelmente seu nome de arquivo não contém caracteres de controle. Mas há 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, erros no software do servidor ou podem produzir tais problemas.

    Experimentei esse tipo de coisa via ftp várias vezes , inclusive para arquivos cujos nomes continham espaços à direita. (Isso não funcionou devido a um bug no meu cliente ftp.) Mesmo quando você cria manualmente um arquivo, dependendo de como você o está criando, às vezes é muito fácil inserir inadvertidamente um espaço à direita, ou outro espaço em branco que pode parecer com espaços mesmo que não seja.

Esta é uma situação em que ls -1b (ou dir -1 ) é útil:

  • -1 informa ls 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 informa ls para imprimir seqüências de escape para quaisquer caracteres especiais. A saída de ls -b pode ser copiada e colada literalmente em um comando, sem adição de citações : todos os caracteres problemáticos já foram citados de uma maneira que faz com que o shell os reconheça como eles são. / li>

Há apenas uma ressalva: se o último caractere em uma linha parecer ser \ , copie um caractere depois disso, pois isso significa que \ está citando um espaço.

Você pode executar ls -1b desse modo ou pode passar um padrão glob de shell a ele (por exemplo, ls -1b qyx* ). A globulação 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.

Tendo copiado a versão \ -quoted do nome de arquivo dado a você por ls , você pode colá-lo em um comando. Você não precisa modificá-lo manualmente de qualquer maneira. No seu caso, como você deseja excluir o arquivo, digite rm , digite um espaço, cole a linha e pressione Enter .

Outras leituras:

  • 10.1 ls : Listar o conteúdo do diretório no Manual de referência do Gutu Coreutils .
  • minha resposta para essa pergunta , que é muito diferente da sua pergunta, mas toca muito em questões de como ls (e dir ) exibe nomes de arquivos estranhos.
por Eliah Kagan 14.05.2015 / 19:58
3
  1. Use find e verifique a saída:

    Se o arquivo não for encontrado, encurte o termo de pesquisa *qyxdshyikfr* ligeiramente, por exemplo: *qyxds* ou *fishing* .

    sudo find . -maxdepth 1 -type f -name "*qyxdshyikfr*"
    
  2. Se estiver bem, use find com o termo de pesquisa na etapa 1 e rm

    find . -maxdepth 1 -type f -name "*qyxdshyikfr*" -print0 | xargs -0  rm
    
por A.B. 14.05.2015 / 13:51
1

Repassando 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 todo o ls output, ele pode ser visto na pergunta se você destacar a saída, ou editar o post e mover o cursor para o final, ou (como Eliah apontou) olhar para o diff no editar histórico. Eu destaquei a saída ls no post nesta captura de tela:

Uma pequena sessão de terminal rápida para duplicar o problema, com comentários:

$ touch 'foo '        # Create file with a space at the end
$ ls -l               # Space is not visible in ls output
total 0
-rw-rw-r-- 1 izkata izkata 0 May 14 21:59 foo 

$ rm foo              # Cannot remove it when not specifying the space
rm: cannot remove ‘foo’: No such file or directory

$ rm 'foo '           # Can remove it if we quote the file name and include the space
$ rm foo\             # Or can escape the space to tell bash to include it as part of the filename

Usar a conclusão da tabulação também teria evitado completamente o problema aqui, já que o bash é inteligente o suficiente para escapar de 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> , teria preenchido automaticamente para rm foo\<space><space> , como no último exemplo no bloco de código acima.

    
por Izkata 15.05.2015 / 05:10
0

uma vez, eu criei um arquivo para abrir o Nautilus como root, mas o nome do arquivo ao ver do nautilus era "Navegador de arquivos (root)", então quando eu tentei remover como

$ rm "File Browser (Root)"
$ sudo rm "File Browser (Root)"
$ sudo rm "File Browser (Root).desktop"

a única resposta que recebi foi: "rm: não é possível remover o 'Navegador de Arquivos (Root) .desktop': Nenhum arquivo ou diretório"

quando eu corro:

$ ls -l

eu vi / lembrei que o nome do arquivo, na verdade, era "Nautilus-root.desktop"

então eu corro:

$ sudo rm "Nautilus-root.desktop"

funcionou para mim, espero que ajude!

    
por Wagner Arcieri 02.10.2016 / 22:19
0

Então eu tive esse problema e nenhuma dessas coisas funcionou para mim. O que funcionou foi criar um arquivo com o mesmo nome. Era uma pasta chamada Example.1.2.3, então criei uma nova pasta e nomeei exatamente a mesma que não excluiria. A pasta antiga desapareceu e apaguei a nova.

    
por Jamison Lifsey 06.07.2017 / 06:46
0

Eu tenho o mesmo problema hoje ... Eu não posso remover ou copiar ou mover ou cat o primeiro arquivo - 2015082818.

[Jing@Jing3 hadoop-2.5.0]$ ll 
total 74748
-rw-rw-r--.  1 Jing Jing 39425518 May  8 16:30 2015082818
-rw-rw-r--.  1 Jing Jing 37091848 May  8 16:30 2015082819

Mas a causa é mais engraçada ... Quando tento remover o arquivo, simplesmente digito

rm 2

e, em seguida, pressione TAB key, então o shell mostra

rm 201508281

e então eu pensei que o shell já me deu o nome completo , então eu pressionei ENTER . Então isso só mostra:

[Jing@Jing3 hadoop-2.5.0]$ cat ../201508281
cat: ../201508281: No such file or directory

É só porque o shell não me avisou o nome completo do arquivo ... O último dígito está faltando e eu não o encontrei ....

    
por Jing He 12.08.2017 / 07:29

Tags