"Nessun file o directory" quando si tenta di rimuovere un file, ma il file esiste?


21

Sto cercando di rimuovere un'immagine png che è stata caricata sul mio server tramite uno script PHP. Ogni volta che provo ad eliminarlo sia tramite ftp che tramite terminale, ricevo l'errore

No such file or directory

Tuttavia, quando mi trovo lsnella directory, il file è elencato ed è anche elencato nel mio client ftp. Ho provato a creare un file con lo stesso nome e finisco per ottenere due file con lo stesso nome.

Posso aprire il file che presumibilmente non esiste, ma non riesco ancora a rimuoverlo. Ho anche provato a riavviare il mio server. Qualche idea su quale potrebbe essere il problema? Sto eseguendo una versione a 64 bit di Ubuntu, ma non credo sia un problema a 32/64 bit. Dovrei anche notare che ho rimosso molti altri file png caricati dallo stesso script PHP.

Uscita per 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

Uscita quando si tenta di rm

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

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


Copia incolla l'output di ls -ldalla directory, anche il rmcomando completo e il suo output ..
heemayl

@heemayl totale 224 -rw-r - r-- 1 www-data www-data 222838 13 maggio 04:14 qyxdshyikfr_fishing_timeout.png -rw-r - r-- 1 radice radice 272 maggio 14 06:54 upload.php rm: impossibile rimuovere "qyxdshyikfr_fishing_timeout.png": nessun file o directory del genere
DevinFrench,

1
@DevinFrench, modifica la domanda per aggiungere informazioni.
muru,

Da quale directory stai eseguendo il rmcomando?
heemayl

1
@Samuel Perché questo suggerisce un problema con il filesystem? La unlinkchiamata non riuscirà sempre a trovare un file che non esiste. Quando eseguo quel stracecomando sul mio sistema, dove so di non avere un file simile, produce un output simile; Non penso che ciò indichi che ho un problema con il filesystem! Sembra molto più probabile che il nome del file sia leggermente diverso qyxdshyikfr_fishing_timeout.pnge appaia semplicemente lo stesso a causa delle limitazioni nel modo in cui lsvengono visualizzati i nomi dei file, come suggerito in altre risposte.
Eliah Kagan,

Risposte:


21

Ho provato a creare un file con lo stesso nome e finisco per ottenere due file con lo stesso nome.

Detto questo, in assenza di corruzione del filesystem, hai due file con due nomi diversi che appaiono uguali a causa di caratteri non stampabili o di caratteri uguali nel tuo set di caratteri / font. L' --escapeopzione per lsè il tuo amico in tali casi, così come strumenti come cat -v.

Lo è anche rm -i -- *

Ulteriori letture


Sono stato il creatore del file e il nome del file che è stato caricato. Nessuno stava cercando di sabotare il mio server poiché sono l'unica persona che conosce il percorso completo di upload.php. Tuttavia, ha rm -i -- *fatto il trucco.
DevinFrench,

3
@DevinFrench Se questa risposta ha risolto il tuo problema, contrassegnala come risposta accettata facendo clic sul segno sotto il conteggio dei voti, in modo che gli utenti futuri possano essere consapevoli del fatto che questa soluzione ha funzionato per te.
Kos

1
Qualcuno può spiegare il rm -i -- *comando?
user3731622,

Da quello che ho capito: Passing -i ti chiederà prima di rimuovere ogni file. --prima *seleziona tutti i file indipendentemente dal fatto che i loro nomi includano caratteri speciali. Riferimento: https://explainshell.com/explain?cmd=rm+-i+--+*
MoltenMuffins

16

TL; DR: esegui ls -1b, trova il nome file, copia la riga su cui appare e assegnalo a rm.

Come altri hanno suggerito, molto probabilmente ciò è dovuto alle limitazioni nel modo in cui ls- e alcuni altri programmi, incluso il software client e server - gestiscono nomi di file strani, come quelli che contengono caratteri di controllo, per impostazione predefinita. Il tuo successo con la risposta di JdeBP suggerisce fortemente che era così, anche se sarebbe stata una buona scommessa anche prima.

  • Perché ls, quando l'output standard è un terminale, i ?caratteri vengono stampati al loro posto. Quindi, se non stai eseguendo lsil piping dell'output su nessun altro comando (o reindirizzandolo a un registro per la visualizzazione), probabilmente il tuo nome file non contiene caratteri di controllo. Ma ci sono altri caratteri problematici - forse il nome del file contiene spazi vuoti finali, per esempio.

    Questo comportamento lspuò essere fonte di confusione ma non è un bug, può essere ignorato esplicitamente dall'utente (vedi sotto).

  • Quando si tenta di accedere o rimuovere un file in remoto, i bug nel software client o server possono causare tali problemi.

    Ho sperimentato questo genere di cose da ftpsolo diverse volte , anche per file i cui nomi contengono spazi finali. (Il fatto che non funzionasse era dovuto a un bug nel mio client ftp.) Anche quando si crea manualmente un file, a seconda di come lo si sta creando, a volte è abbastanza facile inserire inavvertitamente uno spazio finale o altri spazi bianchi che può sembrare spazi anche se non lo è.

Questa è una situazione in cui ls -1b(o dir -1) è utile:

  • -1dice lsdi mostrare una voce per riga. In questo modo non c'è confusione su dove finisca un nome file e ne inizi un altro. Questo è utile per file con nomi strani.
  • -bdice lsdi stampare sequenze di escape per tutti i caratteri speciali. L'output di ls -bpuò essere copiato e incollato letteralmente in un comando, senza virgolette aggiunte : tutti i caratteri problematici sono già citati in un modo che fa sì che la shell li riconosca come sono.

C'è solo un avvertimento: se l'ultimo carattere su una riga sembra essere \, copia un carattere dopo quello, poiché questo significa che \sta citando uno spazio.

Puoi eseguire ls -1besattamente così, oppure puoi passarci un modello di shell glob (ad es ls -1b qyx*.). Globbing può o meno trovare il file, a seconda che siano presenti o meno i caratteri di controllo (o altri caratteri strani) nella parte del nome che appare nel modello glob.

Dopo aver copiato la \versione quotata del nome file che ti è stata assegnata ls, puoi incollarla in un comando. Non è necessario modificarlo manualmente in alcun modo. Nel tuo caso, se desideri eliminare il file, digita rm, digita uno spazio, incolla la linea e premi Enter.

Ulteriori letture:


1
Molto cool grazie -b=) e +1
AB

Qualcosa che ho lasciato fuori da OP è stato quando ho creato un file con lo stesso nome, nel mio client ftp quando ho provato a eliminare il primo file con cui avevo problemi, avrebbe invece eliminato il nuovo file che avevo creato. Questo è il motivo per cui non pensavo che fossero coinvolti personaggi speciali, e ancora non so quale fosse il personaggio speciale da quando l'ho usato rm -i -- *.
DevinFrench,

@DevinFrench Il carattere aggiuntivo è uno spazio alla fine del nome del file. È ancora lsnell'output nella domanda, ma può essere visto in modalità testo solo quando si fa clic su "modifica".
Izkata,

@Izkata Buona chiamata! Avrei dovuto pensare a controllarlo. Appare anche quando espanderò la revisione 3 nella cronologia delle modifiche (il nome file completo, incluso lo spazio finale, è evidenziato in verde e quindi riconoscibile). Quello che hai detto è la spiegazione più definitiva e specificamente corretta finora - se hai pubblicato una risposta che spiega che proviene da uno spazio finale e come lo sai e quale comando rimuoverà il file (se l'OP lo avesse ancora) , So che lo avrei votato.
Eliah Kagan,

@EliahKagan Fatto, con foto
Izkata,

3
  1. Usa finde controlla l'output:

    Se il file non viene trovato, accorciare *qyxdshyikfr*leggermente il termine di ricerca , ad esempio: *qyxds*o *fishing*.

    sudo find . -maxdepth 1 -type f -name "*qyxdshyikfr*"
    
  2. Se ok, usa findil termine di ricerca nel passaggio 1 erm

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

1
Invece di chiamare rmper nome tramite una pipe da finda xargs, raccomando semplicemente di usare findl' -deleteazione. Inoltre sudonon è necessario. Meno significativamente, suggerisco di omettere, -type ftranne dove è chiaramente utile. Presumibilmente se la voce che l'OP vuole eliminare si è rivelata essere un collegamento simbolico, ad esempio, vorrebbe comunque trovarlo e vorrebbe comunque eliminarlo. L' -deleteazione non ostruirà ricorsivamente una directory; né lo sarà il tuo rmcomando poiché non hai -r. Quindi non hai intenzione di colpire accidentalmente un'intera cartella (non vuota) qui non usando -type.
Eliah Kagan,

OK, dammi un secondo.
AB,

Nel mio caso, find ... -deletedice anche "impossibile eliminare ... Nessun file o directory del genere"
Stop Harming Monica,

1

Ripubblicando in dettaglio, ampliato dal mio commento sulla risposta di Eliah

Il problema è invisibile, ma può essere visto se sai cosa cercare: il nome del file include uno spazio alla fine. Poiché hai copiato / incollato l'intero lsoutput, puoi vederlo nella domanda se evidenzi l'output, o modifichi il post e sposti il ​​cursore fino alla fine, oppure (come sottolineato da Eliah) guardi il diff nella cronologia delle modifiche. Ho evidenziato l' lsoutput nel post in questo screenshot:

Spazio extra

Una breve sessione terminale per duplicare il problema, con commenti:

$ 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

L'uso del completamento con tabulazione avrebbe anche completamente evitato il problema qui, poiché bash è abbastanza intelligente da sfuggire correttamente agli spazi (è anche una buona abitudine in generale, accelera così tanto i percorsi di battitura) .

Ad esempio, se avessi digitato rm f<tab>, si sarebbe completato automaticamente rm foo\<space><space>, come nell'ultimo esempio nel blocco di codice sopra.


Faccio una menzione speciale di copia / incolla lsdell'output perché qualcosa di simile è accaduto una volta su StackOverflow (ed è l'intero motivo per cui ho pensato di cercarlo): qualcuno ha un carattere non stampabile nel suo codice e l'unico motivo per cui qualcuno l'ha capito è perché quell'utente ha anche copiato / incollato invece di riscrivere il proprio codice quando ha pubblicato la domanda
Izkata

0

una volta, ho creato un file per aprire Nautilus come root, ma il nome del file quando vedevo da nautilus era "Browser file (root)", quindi quando ho provato a rimuovere come

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

l'unica risposta che ho avuto è stata: "rm: impossibile rimuovere" File Browser (Root) .desktop ": nessun file o directory"

poi quando corro:

$ ls -l

ho visto / ricordato che il nome del file, in effetti, era "Nautilus-root.desktop"

quindi corro:

$ sudo rm "Nautilus-root.desktop"

ha funzionato per me, spero che sia d'aiuto!


0

Quindi ho avuto questo problema e nessuna di queste cose ha funzionato per me. Ciò che ha funzionato è stato la creazione di un file con lo stesso identico nome. Era una cartella denominata Esempio.1.2.3, quindi ho creato una nuova cartella e l'ho chiamata esattamente la stessa di quella che non sarebbe stata eliminata. La vecchia cartella è scomparsa e ho eliminato quella nuova.


0

Ho avuto una situazione simile, dopo aver usato rsyncper il backup della mia cartella Pictures su un Mac e averlo letto su Ubuntu. C'erano due file (in realtà directory) con nomi diversi, ma con lo stesso contenuto. Ne ho cancellato uno nel Cestino (usando Nautilus), ma non sono riuscito a cancellare l'altro, nemmeno dalla riga di comando. Direbbe:

$ rmdir Pictures
rmdir: failed to remove 'Pictures': No such file or directory
$ rm Pictures
rm: cannot remove 'Pictures': Is a directory

Dopo aver verificato i numeri di inode con ls -i -l si è scoperto che entrambe le directory hanno lo stesso numero di inode. Sembra un collegamento reale ...

La soluzione era sorprendentemente semplice: svuota il cestino facendo clic con il tasto destro sull'icona. Dopo che entrambe le directory erano sparite.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.