Bir dosyayı kaldırmaya çalışırken “böyle bir dosya veya dizin yok”, ancak dosya var mı?


21

Bir PHP betiği ile sunucuma yüklenen bir png görüntüsünü kaldırmaya çalışıyorum. Hem ftp hem de terminal aracılığıyla silmeyi denediğimde, hatayı alıyorum

No such file or directory

Ancak, lsdir olduğunda, dosya listelenir ve ftp istemcimde de listelenir. Aynı isimde bir dosya oluşturmayı denedim ve aynı isimde iki dosya aldım.

Sözde olmayan dosyayı açabilirim, ancak hala kaldıramıyorum. Sunucumu yeniden başlatmayı da denedim. Herhangi bir fikir sorun ne olabilir? Ubuntu'nun 64 bit sürümünü kullanıyorum, ancak bunun 32/64 bitlik bir sorun olduğunu sanmıyorum. Ayrıca aynı PHP betiği tarafından yüklenen birçok png dosyasını kaldırdığımı da belirtmeliyim.

İçin çıktı 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

Çalışırken çıktı rm

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

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


Kopyala yapıştır ls -ldizinin çıktısını , aynı zamanda tam rmkomutunu ve çıktısını ..
heemayl

@heemayl toplam 224 -rw-r - r - 1 www-veri www-veri 222838 13 Mayıs 04:14 qyxdshyikfr_fishing_timeout.png -rw-r - r-- 1 kök kökü 272 Mayıs 14 06:54 upload.php rm: 'qyxdshyikfr_fishing_timeout.png' öğesini kaldıramıyor: Böyle bir dosya veya dizin yok
DevinFrench

1
@DevinFrench bilgi eklemek için lütfen sorunuzu düzenleyin .
muru

rmKomutu hangi dizinden kullanıyorsunuz?
heemayl

1
@Samuel Neden bu bir dosya sistemi sorunu öneriyor? unlinkÇağrı daima var olmayan bir dosyayı bulmak için başarısız olur. Bunu çalıştırdığınızda straceüzerine komutu benim ben böyle dosya var biliyorum sistemde, benzer çıktı üretir; Ben gösterir sanmıyorum ben bir dosya sistemi sorun var! Diğer adlarda önerildiği gibi , dosya adının biraz farklı olması qyxdshyikfr_fishing_timeout.pngve lsdosya adlarının görüntülenme şeklindeki sınırlamalar nedeniyle yalnızca aynı görünmesi çok daha muhtemel görünüyor .
Eliah Kagan,

Yanıtlar:


21

Aynı isimde bir dosya oluşturmayı denedim ve aynı isimde iki dosya aldım.

Yani iki dosya olduğunu, devamsızlık dosya sistemi yolsuzluk, diyor iki farklı adlarla aynı görünür çünkü karakter seti / yazı aynı görünüme olmayan baskı karakter veya karakterlerin. --escapeSeçeneği lsolarak örneğin araçlardır, bu tür durumlarda senin arkadaşın cat -v.

Öyleyse, öyle rm -i -- *

daha fazla okuma


Dosyanın yaratıcısı ve yüklenen dosya adı bendim. Upload.php dosyasının tam yolunu bilen tek kişi benim olduğum için hiç kimse sunucumu sabote etmeye çalışıyordu rm -i -- *.
DevinFrench

3
@DevinFrench Bu cevap sorununuzu çözdüyse, lütfen en yüksek puanlar altındaki işarete tıklayarak kabul edilen cevap olarak işaretleyin, böylece gelecekteki kullanıcılar bu çözümün sizin için çalıştığını bilmelidir.
kos,

1
Birisi rm -i -- *komutu açıklayabilir mi?
user3731622

Anladığım kadarıyla: -i Her dosyayı kaldırmadan önce Passing size soracaktır. --önce *isimleri özel karakterler içerip içermediğinden bağımsız olarak tüm dosyaları seçer. Referans: https://explainshell.com/explain?cmd=rm+-i+--+*
MoltenMuffins

16

TL; DR: Çalıştır ls -1b, dosya adını bul, göründüğü satırı kopyala ve ona ver rm.

Diğerlerinin önerdiği gibi, bunun en olası nedeni ls, müşteri ve sunucu yazılımı da dahil olmak üzere bazı programların - varsayılan olarak kontrol karakterleri içerenler gibi garip dosya adlarıyla başa çıkmalarından kaynaklanıyor olmasıdır. JdeBP'nin cevabındaki başarınız , bunun daha önce bile olsa iyi bir bahis olacağına rağmen, durumun böyle olduğunu gösteriyor.

  • İçin lszaman, standart çıktı bir terminal, ?karakterler yerine basılır. Bu nedenle, lsçıkışını başka bir komuta aktarmıyorsanız (veya görüntülemek için bir günlüğe yönlendirirseniz), muhtemelen dosya adınız kontrol karakterleri içermez. Fakat başka problemli karakterler de var - belki de dosya ismi örneğin beyaz boşluk içeriyor.

    Bu davranışını lskarıştırmak kafa karıştırıcı olabilir ancak bir hata değildir, kullanıcı tarafından açıkça geçersiz kılınabilir (aşağıya bakınız).

  • Bir dosyaya uzaktan erişmeye veya kaldırmaya çalışırken, istemci veya sunucu yazılımındaki hatalar bu tür sorunlara neden olabilir.

    Bu tür bir şeyi ftpbirkaç kez kendi başıma deneyimledim , isimleri sonunda boşluk içeren dosyalar da dahil. (İşe yaramadığı ftp istemcimdeki bir hatadan kaynaklanıyordu.) Nasıl kendiniz bir dosya yarattıysanız bile, nasıl oluşturduğunuza bağlı olarak, yanlışlıkla yanlışlıkla bir boşluk veya başka bir boşluk eklemek oldukça kolaydır. olmasa bile boşluk gibi görünebilir.

Bu, ls -1b(veya dir -1) kullanışlı olan bir durumdur :

  • -1lsHer satıra bir giriş göstereceğini söyler . Bu şekilde, bir dosya adının nerede bittiği ve bir başkasının nerede başladığı hakkında bir karışıklık yoktur. Bu garip adlandırılmış dosyalar için kullanışlıdır.
  • -blsherhangi bir özel karakter için kaçış dizileri yazdırılmasını söyler . Çıktısı ls -bkelimenin tam anlamıyla alıntı yapılmadan bir komuta kopyalanabilir ve yapıştırılabilir : tüm sorunlu karakterler zaten kabuğun kendileri olarak tanımasını sağlayacak şekilde belirtilir.

Sadece bir uyarı var: bir satırdaki son karakter göründüğü takdirde \, bundan sonra bir karakter kopyalayın, çünkü bu \bir boşluktan alıntı yapar.

ls -1bAynen böyle koşabilir veya bir kabuk küre desenini ona geçirebilirsiniz (örn ls -1b qyx*.). Globbing, kontrol karakterlerinin (veya diğer garip karakterlerin) glob deseninde görünen adının bir bölümünde bulunup bulunmadığına bağlı olarak dosyayı bulabilir veya bulamayabilir.

\Size verilen dosya adının -kümlü versiyonunu kopyaladıktan sonra ls, bunu bir komuta yapıştırabilirsiniz. Herhangi bir şekilde elle değiştirmek zorunda değilsiniz. Durumunuzda, dosyayı silmek istediğinizde yazın rm, bir boşluk yazın , satırı yapıştırın ve tuşuna basın Enter.

Daha fazla okuma:


1
Çok havalı -bthx =) ve +1
AB

OP dışında bıraktığım bir şey, aynı adı taşıyan bir dosya oluşturduğumda, ftp istemcimde sorun yaşadığım ilk dosyayı silmeye çalıştığımda, yaptığım yeni dosyayı silmekti. Bu yüzden herhangi bir özel karakterin dahil olduğunu düşünmedim ve kullandığımdan beri özel karakterin ne olduğunu hala bilmiyorum rm -i -- *.
DevinFrench

@DevinFrench Ekstra karakter, dosya adının sonundaki bir boşluktur. lsSorunun hala çıktısında, ancak yalnızca "düzenle" yi tıkladığınızda yalnızca metin modunda görülebilir.
Izkata

@ Izkata İyi çağrı! Bunu kontrol etmeyi düşünmeliydim. Ayrıca , düzenleme geçmişinde revizyon 3'ü genişlettiğimde de gözüküyor (izleyen boşluk da dahil olmak üzere tam dosya adı yeşil renkle vurgulanmış ve böylece ayırt edilebilir). Söylediğiniz şey, bugüne kadarki en kesin ve en özel açıklamadır - izleyen bir alandan ve nasıl bildiğinizden ve dosyayı hangi komutun kaldıracağından bahseden bir cevap gönderdiyseniz (OP hala varsa) , Abartacağımı biliyorum.
Eliah Kagan

@EliahKagan Resimlerim
bitti

3
  1. findÇıktıyı kullanın ve kontrol edin:

    Dosya bulunamazsa, arama terimini *qyxdshyikfr*biraz kısaltın, örneğin: *qyxds*veya *fishing*.

    sudo find . -maxdepth 1 -type f -name "*qyxdshyikfr*"
    
  2. Eğer tamamsa, findarama terimiyle 1. adımdaki verm

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

1
Aksine çağırmaktan daha rmbir boru aracılığıyla adıyla findiçin xargs, ben kullanarak basitçe tavsiye find'ın -deleteeylemi. Ayrıca sudogerekli değil. Daha az önemlisi, -type façıkça yararlı olduğu durumlar dışında ihmali öneriyorum . Muhtemelen OP girişini silmek istediğinde sembolik bir bağlantı olduğu ortaya çıktıysa, örneğin, onu hala bulmak istiyorlar ve hala silmek istiyorlardı. -deleteEylem yinelemeli bir dizin clobber etmeyeceğini; ne senin olacak rmSenden sonra komut yok -r. Yani, kazara bir bütün (boş olmayan) klasörü kullanarak kullanmayacaksınız -type.
Eliah Kagan

Tamam, bana bir saniye ver.
AB

Benim durumumda, hatta find ... -delete"silemezsiniz ... Böyle bir dosya veya dizin" diyor
Dur zarar Monica

1

Ayrıntılı olarak repo, Eliah'ın cevabı hakkındaki yorumumdan genişledi

Sorun görünmez, ancak ne arayacağınızı biliyorsanız, görülebilir: Dosya adı sonunda bir boşluk içerir. lsÇıktının tamamını kopyaladığınız / yapıştırdığınız için , çıktıyı vurgularsanız veya yazıyı düzenlerseniz ve imleci sonuna kadar götürürseniz ya da (Eliah'ın işaret ettiği gibi) düzenleme geçmişindeki farklılığa bakarsanız, soruda görülebilir. lsBu ekran görüntüsündeki yazıdaki çıktının altını çizdim:

Fazladan boşluk

Sorunu çoğaltmak için yapılan küçük bir terminal oturumu, yorumlarla:

$ 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

Kullanılması sekme tamamlama da olurdu tamamen bash doğru boşluk kaçmak için akıllı yeterli olduğu gibi burada sorunu kaçınmakla (Aynı zamanda genel olarak iyi bir alışkanlıktır bu kadar yazarak yolları hızlandırır) .

Örneğin, yazmış olsaydım rm f<tab>, rm foo\<space><space>yukarıdaki kod bloğundaki son örnekte olduğu gibi otomatik olarak tamamlanmış olacaktı .


lsStackOverflow'ta benzer bir şey olduğu için (ve bunu aramayı düşündüğüm tek neden) bir şey çıktığında kopyalamak / yapıştırmaktan özel olarak bahsettim : birisi kodunda yazdırılamayan bir karaktere sahipti ve birinin bunu çözmesinin tek sebebi Bunun nedeni, kullanıcının soruyu gönderirken kodunu tekrar yazmak yerine kopyalayıp yapıştırmasıdır
Izkata

0

bir keresinde, Nautilus'u root olarak açmak için bir dosya oluşturdum, fakat nautilus'tan dosya ismi "File Browser (root)" idi, sonra da kaldırmayı denediğimde

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

Sahip olduğum tek cevap: "rm: 'Dosya Tarayıcısını (Root) .desktop' kaldıramıyor: böyle bir dosya veya dizin yok"

sonra kaçtığımda:

$ ls -l

Aslında dosya adının "Nautilus-root.desktop" olduğunu gördüm / hatırladım.

bu yüzden koşuyorum:

$ sudo rm "Nautilus-root.desktop"

benim için çalıştı, yardımcı olur umarım!


0

Bu yüzden bu sorunu yaşadım ve bunlardan hiçbiri benim için çalıştı. İşe yarayan aynı isimde bir dosya oluşturmaktı. Örnek.1.2.3 adlı bir klasördü, bu yüzden yeni bir klasör oluşturdum ve onu silinmeyecek olanla aynı olarak adlandırdım. Eski klasör kayboldu ve ben yenisini sildim.


0

Mac'teki Pictures (Resimler) dizinini rsyncyedeklemeyi ve Ubuntu'da okuduktan sonra da benzer bir durum vardı . Farklı isimlerdeki fakat aynı içeriğe sahip iki dosya (aslında dizinler) vardı. Birini Çöp Kutusuna (Nautilus kullanarak) sildim, ancak komut satırından bile diğerini silemedim. Söylerdi:

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

İnode numaralarını ls -i -l ile kontrol ettikten sonra her iki dizinin de aynı inode numarasına sahip olduğu ortaya çıktı. Sert bir link gibi görünüyor ...

Çözüm şaşırtıcı derecede basitti - simgesine sağ tıklayarak Çöp Kutusunu boşaltın. Bundan sonra her iki dizin de gitti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.