Saya mencoba menghapus gambar png yang diunggah ke server saya melalui skrip PHP. Setiap kali saya mencoba menghapusnya baik melalui ftp dan terminal, saya mendapatkan kesalahan
No such file or directory
Namun, ketika saya ls
di dir, file tersebut terdaftar dan juga terdaftar di klien ftp saya. Saya telah mencoba membuat file dengan nama yang sama dan akhirnya saya mendapatkan dua file dengan nama yang sama.
Saya dapat membuka file yang seharusnya tidak ada, tetapi saya masih tidak bisa menghapusnya. Saya juga mencoba me-reboot server saya. Ada ide apa masalahnya? Saya menjalankan versi 64 bit dari Ubuntu, tapi saya rasa itu bukan masalah 32/64. Saya juga harus mencatat bahwa saya telah menghapus banyak file png lainnya yang diunggah oleh skrip PHP yang sama.
Output untuk 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
Keluaran saat mencoba rm
rm: cannot remove ‘qyxdshyikfr_fishing_timeout.png’: No such file or directory
upload.php: http://pastebin.com/z87eypTY
ls -l
direktori, jugarm
perintah lengkap dan hasilnya ..rm
perintah?unlink
panggilan akan selalu gagal untuk menemukan file yang tidak ada. Ketika saya menjalankanstrace
perintah itu di sistem saya , di mana saya tahu saya tidak punya file seperti itu, itu menghasilkan output yang sama; Saya tidak berpikir itu menunjukkan saya memiliki masalah sistem file! Tampaknya jauh lebih mungkin bahwa nama file sedikit berbedaqyxdshyikfr_fishing_timeout.png
dan hanya muncul sama karena keterbatasan dalam carals
menampilkan nama file, seperti yang disarankan dalam jawaban lain.Jawaban:
Yang mengatakan, tidak ada korupsi filesystem, bahwa Anda memiliki dua file dengan dua nama berbeda yang muncul sama karena karakter yang tidak dicetak atau karakter yang terlihat sama di set karakter Anda / font. The
--escape
pilihan untukls
adalah teman Anda dalam kasus tersebut, seperti alat seperticat -v
.Begitu juga
rm -i -- *
Bacaan lebih lanjut
sumber
rm -i -- *
lakukan triknya.rm -i -- *
perintah?-i
akan meminta Anda sebelum menghapus setiap file.--
sebelum*
memilih semua file terlepas dari apakah namanya termasuk karakter khusus. Referensi: https://explainshell.com/explain?cmd=rm+-i+--+*TL; DR: Jalankan
ls -1b
, cari nama file, salin baris yang muncul, dan berikan iturm
.Seperti yang disarankan orang lain, kemungkinan besar ini karena keterbatasan dalam cara
ls
- dan beberapa program lain, termasuk klien dan perangkat lunak server - menangani nama file aneh, seperti yang berisi karakter kontrol, secara default. Keberhasilan Anda dengan jawaban JdeBP sangat menyarankan ini adalah masalahnya, meskipun itu akan menjadi taruhan yang baik bahkan sebelum itu.Sebab
ls
, ketika output standar adalah terminal,?
karakter dicetak di tempatnya. Jadi, jika Anda tidak memipipkanls
keluaran ke perintah lain (atau mengarahkannya ke log untuk dilihat), mungkin nama file Anda tidak mengandung karakter kontrol. Tetapi ada karakter bermasalah lainnya - mungkin nama file mengandung spasi spasi, misalnya.Perilaku ini
ls
dapat membingungkan tetapi bukan bug, dapat ditimpa secara eksplisit oleh pengguna (lihat di bawah).Ketika mencoba mengakses atau menghapus file dari jarak jauh, bug di perangkat lunak klien atau server dapat menghasilkan masalah seperti itu.
Saya telah mengalami hal semacam ini melalui
ftp
diri saya sendiri beberapa kali , termasuk untuk file yang namanya berisi spasi tambahan. (Bahwa itu tidak berhasil adalah karena bug di klien ftp saya.) Bahkan ketika Anda secara manual membuat file sendiri, tergantung pada bagaimana Anda membuatnya, kadang-kadang cukup mudah untuk secara tidak sengaja memasukkan spasi tambahan, atau spasi putih lain yang mungkin terlihat seperti spasi meskipun tidak.Ini adalah situasi di mana
ls -1b
(ataudir -1
) berguna:-1
memberitahuls
untuk menunjukkan satu entri per baris. Dengan begitu tidak ada kebingungan tentang di mana satu nama file berakhir dan yang lain dimulai. Ini berguna untuk file dengan nama yang aneh.-b
memberitahuls
untuk mencetak urutan pelarian untuk setiap karakter khusus. Keluaran darils -b
dapat disalin dan ditempelkan secara harfiah ke dalam perintah, tanpa mengutip tambahan : semua karakter bermasalah sudah dikutip dengan cara yang menyebabkan shell mengenali mereka sebagai apa adanya.Hanya ada satu peringatan: jika karakter terakhir pada sebuah baris muncul
\
, salin satu karakter setelah itu, karena ini berarti\
mengutip spasi.Anda bisa menjalankannya
ls -1b
begitu saja, atau Anda bisa meneruskan pola gumpalan shell ke sana (mis.,ls -1b qyx*
). Globbing mungkin atau mungkin tidak menemukan file, tergantung pada apakah karakter kontrol (atau karakter aneh lainnya) ada di bagian nama yang muncul dalam pola glob.Setelah menyalin
\
versi -quote dari nama file yang diberikan kepada Anda olehls
, Anda dapat menempelkannya ke dalam perintah. Anda tidak perlu memodifikasinya secara manual dengan cara apa pun. Dalam kasus Anda, saat Anda ingin menghapus file, ketikrm
, ketik spasi, tempel baris, dan tekan Enter.Bacaan lebih lanjut:
ls
: Daftar isi direktori dalam manual referensi GNU coreutils .ls
(dandir
) menampilkan nama file yang aneh.sumber
-b
thx =) dan +1rm -i -- *
.ls
output dalam pertanyaan, tetapi hanya dapat dilihat dalam mode teks ketika Anda mengklik "edit".Gunakan
find
dan periksa hasilnya:Jika file tidak ditemukan, maka persingkat istilah pencarian
*qyxdshyikfr*
sedikit, misalnya:*qyxds*
atau*fishing*
.Jika ok, daripada gunakan
find
dengan istilah pencarian di langkah 1 danrm
sumber
rm
dengan nama melalui pipa darifind
kexargs
, saya sarankan hanya menggunakanfind
's-delete
tindakan. Jugasudo
tidak diperlukan. Kurang signifikan, saya sarankan menghilangkan-type f
kecuali itu jelas membantu. Agaknya jika entri yang ingin dihapus OP ternyata adalah tautan simbolis, misalnya, mereka masih ingin menemukannya dan masih ingin menghapusnya. The-delete
tindakan tidak akan rekursif mengkritik direktori; tidak akanrm
perintah Anda karena Anda tidak punya-r
. Jadi, Anda tidak akan secara tidak sengaja memukul folder utuh (tidak kosong) di sini dengan tidak menggunakan-type
.find ... -delete
mengatakan "tidak dapat menghapus ... Tidak ada file atau direktori"Reposting secara detail, diperluas dari komentar saya pada jawaban Eliah
Masalahnya tidak terlihat, tetapi dapat dilihat jika Anda tahu apa yang harus dicari: Nama file termasuk spasi di bagian akhir. Karena Anda menyalin / menempelkan seluruh
ls
output, itu dapat dilihat dalam pertanyaan jika Anda menyorot output, atau mengedit posting dan memindahkan kursor ke akhir, atau (seperti yang ditunjukkan Eliah) melihat perbedaan dalam histori edit. Saya menyorotils
output dalam pos di tangkapan layar ini:Sesi terminal kecil cepat untuk menduplikasi masalah, dengan komentar:
Menggunakan penyelesaian tab juga akan sepenuhnya menghindari masalah di sini, karena bash cukup pintar untuk keluar dari ruang dengan benar (Ini juga merupakan kebiasaan yang baik pada umumnya, mempercepat jalur pengetikan begitu banyak) .
Sebagai contoh, seandainya saya mengetik
rm f<tab>
, maka akan selesai secara otomatisrm foo\<space><space>
, seperti pada contoh terakhir di blok kode di atas.sumber
ls
output karena sesuatu yang serupa terjadi pada StackOverflow sekali (dan seluruh alasan saya berpikir untuk mencari ini): seseorang mendapat karakter yang tidak dapat dicetak dalam kode mereka, dan satu-satunya alasan ada yang tahu karena pengguna itu juga menyalin / menempel alih-alih mengetik ulang kode mereka saat memposting pertanyaansekali, saya telah membuat file untuk membuka Nautilus sebagai root, tetapi nama file ketika melihat dari nautilus adalah "File Browser (root)", lalu ketika saya mencoba menghapus sebagai
satu-satunya server yang saya dapatkan adalah: "rm: tidak dapat menghapus 'File Browser (Root) .desktop': Tidak ada file atau direktori"
maka ketika saya menjalankan:
saya melihat / mengingat bahwa nama file itu, sebenarnya, adalah "Nautilus-root.desktop"
jadi saya jalankan:
bekerja untuk saya, semoga membantu!
sumber
Jadi saya punya masalah ini dan tidak ada yang berhasil untuk saya. Apa yang berhasil adalah membuat file dengan nama yang sama persis. Itu adalah folder bernama Example.1.2.3 jadi saya membuat folder baru dan menamakannya sama persis dengan yang tidak akan dihapus. Folder lama menghilang dan saya menghapus yang baru.
sumber
Saya memiliki situasi yang sama, setelah menggunakan
rsync
untuk membackup direktori Pictures saya di Mac dan membacanya di Ubuntu. Ada dua file (sebenarnya direktori) dengan nama yang berbeda, tetapi memiliki konten yang sama. Saya menghapus satu ke Sampah (menggunakan Nautilus), tetapi tidak bisa menghapus yang lain, bahkan dari baris perintah. Itu akan mengatakan:Setelah memeriksa nomor inode dengan ls -i-l ternyata kedua direktori memiliki nomor inode yang sama. Tampak seperti tautan keras ...
Solusinya sangat sederhana - mengosongkan Sampah dengan mengklik kanan ikon. Setelah itu kedua direktori hilang.
sumber