Estoy tratando de eliminar una imagen png que se cargó en mi servidor a través de un script PHP. Cada vez que intento eliminarlo a través de ftp y terminal, aparece el error
No such file or directory
Sin embargo, cuando estoy lsen el directorio, el archivo aparece en la lista y también aparece en mi cliente ftp. He intentado crear un archivo con el mismo nombre y termino obteniendo dos archivos con el mismo nombre.
Puedo abrir el archivo que supuestamente no existe, pero todavía no puedo eliminarlo. También he intentado reiniciar mi servidor. ¿Alguna idea de cuál puede ser el problema? Estoy ejecutando una versión de Ubuntu de 64 bits, pero no creo que sea un problema de 32/64 bits. También debo tener en cuenta que he eliminado muchos otros archivos png cargados por el mismo script PHP.
Salida 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
Salida al intentar rm
rm: cannot remove ‘qyxdshyikfr_fishing_timeout.png’: No such file or directory
upload.php: http://pastebin.com/z87eypTY

ls -ldesde el directorio, también el plenormde comandos y su salida ..rmcomando?unlinkllamada siempre fallará al encontrar un archivo que no existe. Cuando ejecuto esestracecomando en mi sistema, donde sé que no tengo dicho archivo, produce una salida similar; ¡No creo que eso indique que tengo un problema con el sistema de archivos! Parece mucho más probable que el nombre del archivo sea ligeramente diferenteqyxdshyikfr_fishing_timeout.pngy simplemente aparezca igual debido a las limitaciones en la forma en que selsmuestran los nombres de los archivos, como se sugiere en otras respuestas.Respuestas:
Eso dice, en ausencia de corrupción del sistema de archivos, que tiene dos archivos con dos nombres diferentes que parecen iguales debido a caracteres que no se imprimen o caracteres que se ven iguales en su conjunto de caracteres / fuente. La
--escapeopciónlses tu amigo en tales casos, como son herramientas comocat -v.Entonces, también, es
rm -i -- *Otras lecturas
fuente
rm -i -- *funcionó.rm -i -- *comando?-iindicará antes de eliminar cada archivo.--before*selecciona todos los archivos independientemente de si sus nombres incluyen caracteres especiales. Referencia: https://explainshell.com/explain?cmd=rm+-i+--+*TL; DR: Ejecutar
ls -1b, buscar el nombre del archivo, copiar la línea en la que aparece y dárselorm.Como otros han sugerido, lo más probable es que esto se deba a limitaciones en la forma,
lsy algunos otros programas, incluido el software de cliente y servidor, manejan nombres de archivo extraños, como los que contienen caracteres de control, de forma predeterminada. Su éxito con la respuesta de JdeBP sugiere fuertemente que este fue el caso, aunque hubiera sido una buena apuesta incluso antes de eso.Para
ls, cuando la salida estándar es un terminal, los?caracteres se imprimen en su lugar. Entonces, si no está canalizandolsla salida de ningún otro comando (o redirigiéndolo a un registro para ver), probablemente su nombre de archivo no contenga caracteres de control. Pero hay otros caracteres problemáticos, tal vez el nombre del archivo contiene espacios en blanco al final, por ejemplo.Este comportamiento
lspuede ser confuso pero no es un error, puede ser anulado explícitamente por el usuario (ver más abajo).Al intentar acceder o eliminar un archivo de forma remota, los errores en el software del cliente o servidor pueden producir tales problemas.
He experimentado este tipo de cosas a través de
ftpmí varias veces , incluso para archivos cuyos nombres contienen espacios finales. (El hecho de que no funcionó se debió a un error en mi cliente ftp). Incluso cuando crea un archivo manualmente usted mismo, dependiendo de cómo lo esté creando, a veces es bastante fácil insertar inadvertidamente un espacio final u otro espacio en blanco que puede parecer espacios aunque no lo sea.Esta es una situación en la que
ls -1b(odir -1) es útil:-1le dicelsque muestre una entrada por línea. De esa manera no hay confusión acerca de dónde termina un nombre de archivo y comienza otro. Esto es útil para archivos con nombres raros.-ble dicelsque imprima secuencias de escape para cualquier personaje especial. La salida dels -bse puede copiar y pegar literalmente en un comando, sin comillas adicionales : todos los caracteres problemáticos ya se citan de una manera que hace que el shell los reconozca como lo que son.Solo hay una advertencia: si el último carácter en una línea parece ser
\, copie un carácter después de eso, ya que esto significa que\está citando un espacio.Puede correr
ls -1basí, o puede pasarle un patrón de globo (por ejemplo,ls -1b qyx*). Globbing puede o no encontrar el archivo, dependiendo de si los caracteres de control (u otros caracteres extraños) están presentes en la parte del nombre que aparece en el patrón global.Después de copiar la
\versión entrecomillada del nombre de archivo que le proporcionóls, puede pegarla en un comando. No tiene que modificarlo manualmente de ninguna manera. En su caso, cuando desee eliminar el archivo, escribarm, escriba un espacio, pegue la línea y presione Enter.Otras lecturas:
ls: Listar el contenido del directorio en el manual de referencia de GNU coreutils .ls(ydir) muestra nombres de archivo extraños.fuente
-bthx =) y +1rm -i -- *.lssalida de la pregunta, pero solo se puede ver en modo texto cuando hace clic en "editar".Use
findy verifique la salida:Si no se encuentra el archivo, acorte
*qyxdshyikfr*ligeramente el término de búsqueda , por ejemplo:*qyxds*o*fishing*.Si está bien, use
findcon el término de búsqueda en el paso 1 yrmfuente
rmpor nombre a través de una canalización defindaxargs, recomiendo simplemente usarfindla-deleteacción de. Tampocosudoes necesario. Menos significativamente, sugiero omitir,-type fexcepto cuando sea claramente útil. Presumiblemente, si la entrada que el OP desea eliminar resultó ser un enlace simbólico, por ejemplo, todavía querrían encontrarlo y aún así eliminarlo. La-deleteacción no golpeará recursivamente un directorio; tampoco lo hará surmcomando ya que no tiene-r. Por lo tanto, no va a golpear accidentalmente una carpeta completa (no vacía) aquí al no usarla-type.find ... -deletedice "no se puede eliminar ... No existe tal archivo o directorio"Reposicionando en detalle, ampliado de mi comentario sobre la respuesta de Eliah
El problema es invisible, pero se puede ver si sabe qué buscar: el nombre del archivo incluye un espacio al final. Debido a que copió / pegó todo el
lsresultado, se puede ver en la pregunta si resalta el resultado, o edita la publicación y mueve el cursor al final, o (como señaló Eliah) mira el diferencial en el historial de edición. Destaqué ellsresultado en la publicación en esta captura de pantalla:Una pequeña sesión de terminal rápida para duplicar el problema, con comentarios:
El uso de la finalización de tabulación también habría evitado por completo el problema aquí, ya que bash es lo suficientemente inteligente como para escapar de los espacios correctamente (también es un buen hábito en general, acelera mucho los caminos de mecanografía) .
Por ejemplo, si hubiera escrito
rm f<tab>, se habría completado automáticamenterm foo\<space><space>, como en el último ejemplo en el bloque de código anterior.fuente
lsresultado porque algo similar sucedió en StackOverflow una vez (y es la razón por la que pensé en buscar esto): alguien obtuvo un carácter no imprimible en su código, y la única razón por la que alguien lo descubrió es porque ese usuario también copió / pegó en lugar de volver a escribir su código al publicar la preguntauna vez, creé un archivo para abrir Nautilus como root, pero el nombre del archivo cuando lo vi desde nautilus fue "File Browser (root)", luego cuando intenté eliminarlo como
la única respuesta que obtuve fue: "rm: no se puede eliminar 'File Browser (Root) .desktop': No existe tal archivo o directorio"
entonces cuando corro:
Vi / recordé que el nombre del archivo, de hecho, era "Nautilus-root.desktop"
entonces corro:
funcionó para mí, espero que ayude!
fuente
Así que tuve este problema y ninguna de estas cosas funcionó para mí. Lo que funcionó fue crear un archivo con exactamente el mismo nombre. Era una carpeta llamada Example.1.2.3, así que creé una nueva carpeta y la llamé exactamente igual a la que no se eliminaría. La carpeta anterior desapareció y eliminé la nueva.
fuente
Tuve una situación similar, después de usar
rsyncpara hacer una copia de seguridad de mi directorio de imágenes en una Mac y leerlo en Ubuntu. Había dos archivos (en realidad directorios) con nombres diferentes, pero con el mismo contenido. Eliminé uno en la Papelera (usando Nautilus), pero no pude eliminar el otro, incluso desde la línea de comandos. Diría:Después de verificar los números de inodo con ls -i -l, resultó que ambos directorios tienen el mismo número de inodo. Parece un enlace duro ...
La solución fue sorprendentemente simple: vaciar la Papelera haciendo clic derecho en el icono. Después de eso, ambos directorios desaparecieron.
fuente