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 ls
en 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 -l
desde el directorio, también el plenorm
de comandos y su salida ..rm
comando?unlink
llamada siempre fallará al encontrar un archivo que no existe. Cuando ejecuto esestrace
comando 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.png
y simplemente aparezca igual debido a las limitaciones en la forma en que sels
muestran 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
--escape
opciónls
es 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?-i
indicará 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,
ls
y 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á canalizandols
la 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
ls
puede 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
ftp
mí 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:-1
le dicels
que 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.-b
le dicels
que imprima secuencias de escape para cualquier personaje especial. La salida dels -b
se 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 -1b
así, 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
-b
thx =) y +1rm -i -- *
.ls
salida de la pregunta, pero solo se puede ver en modo texto cuando hace clic en "editar".Use
find
y 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
find
con el término de búsqueda en el paso 1 yrm
fuente
rm
por nombre a través de una canalización defind
axargs
, recomiendo simplemente usarfind
la-delete
acción de. Tampocosudo
es necesario. Menos significativamente, sugiero omitir,-type f
excepto 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-delete
acción no golpeará recursivamente un directorio; tampoco lo hará surm
comando 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 ... -delete
dice "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
ls
resultado, 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é ells
resultado 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
ls
resultado 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
rsync
para 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