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 à la fois via ftp et terminal, j'obtiens l'erreur
No such file or directory
Cependant, lorsque je suis ls
dans le répertoire, le fichier est répertorié et il est également répertorié 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 quel 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 en essayant de rm
rm: cannot remove ‘qyxdshyikfr_fishing_timeout.png’: No such file or directory
upload.php: http://pastebin.com/z87eypTY
ls -l
répertoire, ainsi que larm
commande complète et sa sortie ..rm
commande?unlink
appel échouera toujours pour trouver un fichier qui n'existe pas. Lorsque j'exécute cettestrace
commande sur mon système, où je sais que je n'ai pas un tel fichier, cela produit une sortie similaire; Je ne pense pas que cela indique que j'ai un problème de système de fichiers! Il semble beaucoup plus probable que le nom du fichier soit légèrement différentqyxdshyikfr_fishing_timeout.png
et apparaisse simplement le même en raison des limitations dans la façon dontls
les noms de fichiers s'affichent, comme suggéré dans d'autres réponses.Réponses:
Cela signifie, en l'absence de corruption du système de fichiers, que vous avez deux fichiers avec deux noms différents qui semblent identiques en raison de caractères non imprimables ou de caractères identiques dans votre jeu de caractères / police. L'
--escape
optionls
est votre ami dans de tels cas, tout comme des outils tels quecat -v
.Il en va de même pour
rm -i -- *
Lectures complémentaires
la source
rm -i -- *
fait l'affaire.rm -i -- *
commande?-i
vous invitera avant la suppression de chaque fichier.--
avant*
sélectionne tous les fichiers, que leurs noms incluent ou non des caractères spéciaux. Référence: https://explainshell.com/explain?cmd=rm+-i+--+*TL; DR: Exécutez
ls -1b
, recherchez le nom de fichier, copiez la ligne sur laquelle il apparaît et donnez-le àrm
.Comme d'autres l'ont suggéré, cela est probablement dû à des limitations dans la façon dont
ls
- 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 la réponse de JdeBP suggère fortement que c'était le cas, même si cela aurait été un bon pari avant cela.Car
ls
, lorsque la sortie standard est un terminal, les?
caractères sont imprimés à leur place. Donc, si vous nels
redirigez pas la sortie vers une autre commande (ou si vous ne la redirigez pas vers un journal pour la visualisation), votre nom de fichier ne contient probablement pas de caractères de contrôle. Mais il y a d'autres caractères problématiques - peut-être que le nom du fichier contient des espaces de fin, par exemple.Ce comportement de
ls
peut être déroutant mais n'est pas un bogue, peut être explicitement remplacé par l'utilisateur (voir ci-dessous).Lorsque vous tentez d'accéder ou de supprimer un fichier à distance, des bogues dans le logiciel client ou serveur peuvent produire de tels problèmes.
J'ai vécu ce genre de choses
ftp
plusieurs fois par moi-même , y compris pour les fichiers dont les noms contiennent des espaces de fin. (Le fait que cela n'ait pas fonctionné était dû à un bogue dans mon client ftp.) Même lorsque vous créez manuellement un fichier vous-même, selon la façon dont vous le créez, il est parfois assez facile d'insérer par inadvertance un espace de fin ou un autre espace blanc qui peut ressembler à des espaces même si ce n'est pas le cas.C'est une situation où
ls -1b
(oudir -1
) est utile:-1
indiquels
d'afficher une entrée par ligne. De cette façon, il n'y a aucune confusion quant à la fin d'un nom de fichier et au début d'un autre. C'est pratique pour les fichiers aux noms étranges.-b
indiquels
d'imprimer des séquences d'échappement pour tous les caractères spéciaux. La sortie dels -b
peut être copiée et collée littéralement dans une commande, sans ajout de guillemets : tous les caractères problématiques sont déjà cités de manière à ce que le shell les reconnaisse tels qu'ils sont.Il n'y a qu'une seule mise en garde: si le dernier caractère sur une ligne semble être
\
, copiez un caractère après cela, car cela signifie\
citer un espace.Vous pouvez exécuter
ls -1b
juste comme ça, ou vous pouvez lui passer un modèle de glob de shell (par exemple,ls -1b qyx*
). Globbing peut ou non trouver le fichier, selon que les caractères de contrôle (ou d'autres caractères étranges) sont présents ou non dans la partie du nom apparaissant dans le modèle global.Après avoir copié la
\
version citée du nom de fichier qui vous a été donné parls
, vous pouvez le coller dans une commande. Vous n'avez en aucun cas à le modifier manuellement. Dans votre cas, comme vous souhaitez supprimer le fichier, tapezrm
, tapez un espace, collez la ligne et appuyez sur Enter.Lectures complémentaires:
ls
: Liste le contenu du répertoire dans le manuel de référence GNU coreutils .ls
(etdir
) affiche les noms de fichiers étranges.la source
-b
Thx très cool =) et +1rm -i -- *
.ls
sortie de la question, mais ne peut être vu qu'en mode texte lorsque vous cliquez sur "modifier".Utilisez
find
et vérifiez la sortie:Si le fichier est introuvable, raccourcissez
*qyxdshyikfr*
légèrement le terme de recherche , par exemple:*qyxds*
ou*fishing*
.Si cela vous convient, utilisez-le
find
avec le terme de recherche à l'étape 1 etrm
la source
rm
par son nom via un canal defind
àxargs
, je recommande simplement d'utiliserfind
l'-delete
action de. Cesudo
n'est pas non plus nécessaire. De manière moins significative, je suggère de l'omettre,-type f
sauf lorsque c'est clairement utile. Vraisemblablement, si l'entrée que l'OP veut supprimer s'est avérée être un lien symbolique, par exemple, ils voudraient toujours la trouver et voudraient toujours la supprimer. L'-delete
action n'encombrera pas récursivement un répertoire; votrerm
commande non plus puisque vous n'en avez pas-r
. Donc, vous n'allez pas accidentellement détruire un dossier entier (non vide) ici en ne l'utilisant pas-type
.find ... -delete
dit "ne peut pas supprimer ... Aucun fichier ou répertoire de ce type"Republication en détail, développée à partir de mon commentaire sur la réponse d'Eliah
Le problème est invisible, mais peut être vu si vous savez quoi rechercher: Le nom du fichier comprend un espace à la fin. Étant donné que vous copiez / collez l'intégralité de la
ls
sortie, vous pouvez voir dans la question si vous mettez en surbrillance la sortie, ou modifiez le post et déplacez le curseur à la fin, ou (comme Eliah l'a souligné) regardez le diff dans l'historique des modifications. J'ai mis en évidence lals
sortie dans le post dans cette capture d'écran:Une petite session de terminal rapide pour dupliquer le problème, avec des commentaires:
L'utilisation de la tabulation aurait également complètement évité le problème ici, car bash est assez intelligent pour échapper correctement les 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 se serait complété automatiquementrm foo\<space><space>
, comme dans le dernier exemple du bloc de code ci-dessus.la source
ls
sortie parce que quelque chose de similaire s'est produit sur StackOverflow une fois (et c'est la raison pour laquelle j'ai pensé chercher ceci): quelqu'un a obtenu un caractère non imprimable dans son code, et la seule raison pour laquelle quelqu'un l'a compris est parce que cet utilisateur a également copié / collé au lieu deune fois, j'ai créé un fichier pour ouvrir Nautilus en tant que root, mais le nom du fichier en voyant depuis nautilus était "File Browser (root)", puis quand j'ai essayé de le supprimer comme
la seule réponse que j'ai reçue était: "rm: ne peut pas supprimer 'File Browser (Root) .desktop': Aucun fichier ou répertoire de ce type"
puis quand je cours:
j'ai vu / retenu que le nom du fichier était en fait "Nautilus-root.desktop"
alors je cours:
travaillé pour moi, j'espère que ça aide!
la source
J'ai donc eu ce problème et aucune de ces choses n'a fonctionné pour moi. Ce qui a fonctionné était de créer un fichier avec exactement le même nom. C'était un dossier nommé Example.1.2.3, j'ai donc créé un nouveau dossier et je l'ai nommé exactement le même que celui qui ne voulait pas être supprimé. L'ancien dossier a disparu et j'ai supprimé le nouveau.
la source
J'ai eu une situation similaire, après avoir utilisé
rsync
pour sauvegarder mon répertoire Pictures sur un Mac et l'avoir lu sur Ubuntu. Il y avait deux fichiers (en fait des répertoires) avec des noms différents, mais ayant le même contenu. J'ai supprimé l'un dans la corbeille (à l'aide de Nautilus), mais je n'ai pas pu supprimer l'autre, même depuis la ligne de commande. Cela dirait:Après avoir vérifié les numéros d'inode avec ls -i -l, il s'est avéré que les deux répertoires ont le même numéro d'inode. On dirait un lien dur ...
La solution était étonnamment simple - videz la corbeille en cliquant avec le bouton droit sur l'icône. Après cela, les deux répertoires ont disparu.
la source