web-dev-qa-db-fra.com

"Aucun fichier ou répertoire de ce type" lorsque vous essayez de supprimer un fichier, mais que le fichier existe?

J'essaie de supprimer une image png qui a été téléchargée sur mon serveur via un script PHP. Chaque fois que j'essaie de le supprimer via ftp et terminal, j'obtiens l'erreur

No such file or directory

Cependant, lorsque je ls dans le répertoire, le fichier est répertorié et il figure également dans mon client ftp. J'ai essayé de créer un fichier avec le même nom et je finis par obtenir deux fichiers avec le même nom.

Je peux ouvrir le fichier qui n'existe pas, mais je ne peux toujours pas le supprimer. J'ai également essayé de redémarrer mon serveur. Des idées ce qui peut être le problème? J'utilise une version 64 bits d'Ubuntu, mais je ne pense pas que ce soit un problème 32/64 bits. Je dois également noter que j'ai supprimé de nombreux autres fichiers png téléchargés par le même script PHP.

Sortie pour 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

Sortie lors de la tentative de rm

rm: cannot remove ‘qyxdshyikfr_fishing_timeout.png’: No such file or directory

upload.php: http://Pastebin.com/z87eypTY

19
DevinFrench

J'ai essayé de créer un fichier avec le même nom et je finis par obtenir deux fichiers avec le même nom.

Cela signifie, en l'absence de corruption du système de fichiers, que vous avez deux fichiers portant deux noms différents qui apparaissent de la même manière en raison de caractères non imprimables ou de caractères identiques dans votre jeu de caractères/police. L'option --escape de ls est votre ami dans de tels cas, de même que des outils tels que cat -v.

Alors, rm -i -- * aussi

Lectures complémentaires

21
JdeBP

TL; DR: Exécutez ls -1b, recherchez le nom du fichier, copiez le ligne sur laquelle il apparaît et donnez-le à rmname __.

Comme d'autres l'ont suggéré, cela est probablement dû à des limitations dans la manière dont lsname __-- et certains autres programmes, y compris les logiciels client et serveur, gèrent les noms de fichiers étranges, tels que ceux contenant des caractères de contrôle, par défaut. Votre succès avec réponse de JdeBP suggère fortement que c'était le cas, même si cela aurait été un bon pari, même avant cela.

  • Pour lsname__, lorsque sortie standard est un terminal, des caractères ? sont imprimés à leur place. Ainsi, si vous ne transmettez pas la sortie de lsname __ à une autre commande (ou que vous la redirigiez vers un journal à afficher), votre nom de fichier ne contient probablement pas de caractères de contrôle. Mais il existe d'autres caractères problématiques - par exemple, le nom de fichier contient des espaces, par exemple.

    Ce comportement de lspeut être déroutant, mais il ne s'agit pas d'un bogue, il peut être remplacé explicitement par l'utilisateur (voir ci-dessous).

  • Lorsque vous tentez d'accéder à un fichier ou de le supprimer à distance, les bogues du logiciel client ou peuvent générer de tels problèmes.

    J'ai moi-même fait l'expérience de ce genre de choses via ftpplusieurs fois , y compris pour les fichiers dont le nom contient des espaces de fin. (Cela ne fonctionnait pas en raison d’un bogue dans mon client ftp.) Même lorsque vous créez manuellement un fichier vous-même, il est parfois très facile d’insérer par inadvertance un espace de fin ou d’autres espaces peut ressembler à des espaces même si ce n'est pas le cas.

Il s'agit d'une situation où ls -1b (ou dir -1 ) est pratique:

  • -1 indique à lsd'afficher une entrée par ligne. De cette façon, il n’ya pas de confusion quant à la fin d’un fichier et le début d’un autre. C'est pratique pour les fichiers étrangement nommés.
  • -b indique à lsd'imprimer des séquences d'échappement pour tous les caractères spéciaux. La sortie de ls -b peut être copiée et collée littéralement dans une commande sans les guillemets ajoutés : tous les caractères problématiques sont déjà cités de manière à ce que le shell les reconnaisse comme tels. sont.

Une seule mise en garde: si le dernier caractère d'une ligne semble être \, copiez un caractère après cela, car cela signifie que \ indique un espace.

Vous pouvez exécuter ls -1b comme cela, ou vous pouvez lui transmettre un modèle de globalisation de shell (par exemple, ls -1b qyx*). Globbing peut ou non trouver le fichier, selon que les caractères de contrôle (ou autres caractères étranges) sont présents dans la partie du nom apparaissant dans le motif glob.

Après avoir copié la version \- du nom de fichier qui vous a été attribué par lsname__, vous pouvez la coller dans une commande. Vous n'êtes pas obligé de le modifier manuellement. Dans votre cas, pour supprimer le fichier, saisissez rmname__, tapez un espace, collez la ligne et appuyez sur Enter.

Lectures supplémentaires:

16
Eliah Kagan
  1. Utilisez find et vérifiez le résultat:

    Si le fichier n'est pas trouvé, raccourcissez légèrement le terme de recherche *qyxdshyikfr*, par exemple: *qyxds* ou *fishing*.

    Sudo find . -maxdepth 1 -type f -name "*qyxdshyikfr*"
    
  2. Si ok, utilisez find avec le terme recherché à l’étape 1 et rm

    find . -maxdepth 1 -type f -name "*qyxdshyikfr*" -print0 | xargs -0  rm
    
3
A.B.

Reposting en détail, développé à partir de mon commentaire sur la réponse d'Eliah

Le problème est invisible, mais peut être vu si vous savez quoi chercher: Le nom du fichier inclut un espace à la fin. Comme vous avez copié/collé l'intégralité de la sortie ls, vous pouvez voir dans la question si vous mettez en surbrillance la sortie, éditez la publication et déplacez le curseur à la fin, ou (comme Eliah l'a souligné), examinez le diff dans l'historique d'édition. . J'ai mis en surbrillance la sortie ls dans l'article de cette capture d'écran:

Extra space

Une petite session de terminal rapide pour dupliquer le problème, avec des commentaires:

$ 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

Utiliser complétion par des tabulations aurait également complètement évité le problème ici, car bash est suffisamment intelligent pour échapper correctement aux espaces (C'est aussi une bonne habitude en général, accélère tellement les chemins de frappe).

Par exemple, si j'avais tapé rm f<tab>, il aurait été complété automatiquement par rm foo\<space><space>, comme dans le dernier exemple du bloc de code ci-dessus.

1
Izkata

une fois, j'ai créé un fichier pour ouvrir Nautilus en tant que root, mais le nom du fichier lors de la visualisation de Nautilus était "File Browser (root)", puis, lorsque j'ai essayé de le supprimer,

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

la seule réponse que j'ai eu était: "rm: impossible de supprimer 'File Browser (Root) .desktop': Aucun fichier ou répertoire de ce type"

alors quand je cours:

$ ls -l

j'ai vu/rappelé que le nom du fichier, en fait, était "Nautilus-root.desktop"

alors je cours:

$ Sudo rm "Nautilus-root.desktop"

travaillé pour moi, espérons que cela aide!

0
Wagner Arcieri

J'ai donc eu ce problème et aucune de ces choses n'a fonctionné pour moi. Ce qui a bien fonctionné a été de créer un fichier portant exactement le même nom. C'était un dossier nommé Example.1.2.3, j'ai donc créé un nouveau dossier et l'ai nommé de la même manière que celui qui n'a pas été supprimé. L'ancien dossier a disparu et j'ai supprimé le nouveau.

0
Jamison Lifsey