Adı “-” ile başlayan bir dosyayı nasıl silebilirim (kısa çizgi veya kısa çizgi)?


349

Dosya adı kısa çizgi ile başlayan bir dosyayı nasıl kaldırırsınız (kısa çizgi veya eksi) -? Uzak bir OSX sunucusuna ssh'd yapıyorum ve bu dosya dizinimde var:

tohru:~ $ ls -l
total 8
-rw-r--r--    1 me  staff  1352 Aug 18 14:33 --help
...

Dünyada --helpbir CLI'dan nasıl silebilirim ? Bu sorun, zaman zaman farklı biçimlerde karşılaştığım bir şey, bu dosyaların oluşturulması kolay, ancak kurtulmaları zor.

Ters eğik çizgi kullanmayı denedim

rm \-\-help

Tırnakları denedim

rm "--help"

Eksi (kısa çizgi veya kısa çizgi) karakterinin seçenek olarak yorumlanmasını nasıl önlerim?


1
Bu soru, "Adı ile başlayan bir dosyayı silme" olarak yeniden adlandırılsa çok iyi olurdu.
Sandy

@Sandy Agreed; Normalde bir sorunun anlamını değiştirmekten hoşlanmam, ancak bu durumda kabul edilen cevap bu soruna özeldir
Michael Mrozek

33
rm --helpAslında a ile başlayan dosya adlarının nasıl silineceğini açıklayan biraz ironik buluyorum -. Yine de iyi bir soru.
lesmana

1
@ jw013 Bazen yardım, deneyimli kullanıcıların anlaması için kolay, ancak ezici ve yenilere kafa karıştırıcı olabilir.
iconoclast

1
BusyBox'tan rm kullanan bir sistemde buna rastladım. Yardım dahil her şey çok az, bu nedenle rm --help herhangi bir ipucu vermedi.
dslake

Yanıtlar:


497

Rm komut satırı seçeneklerini ayrıştırma işlemini durdurmak için "-" kullanın:

rm -- --help

1
Bunun gibi basit bir şey olduğunu biliyordum ...
Bryan Rehbein

2
rmKomutun tüm sürümleri --argümanı destekliyor mu?
Keith Thompson,

3
@KeithThompson - çoğu GNU araçlarının bir özelliğidir, bu nedenle çoğu GNU dışı ("Linux dışı") Unix'lerde (örn. BSD varyantları veya bazı gömülü sistemler)
çalışmaz

1
TEŞEKKÜRLER! Bu benim günümü kurtardı. Ve elbette BSD (OSX) ve diğer komutlarla da çalışıyor!
raskhadafi

8
@ dtech, getopt () ve --GNU öncesi (SysIII, 1980) ve standart / POSIX'tir. Standart istisnalar hariç birkaç istisna dışında (gibi echo) anlarsınız --. Diğer komutlar için YMMV, seçenekleri ayrıştırmak için getopt () API kullanmazlarsa.
Stéphane Chazelas

214

Ya da yapabilirsin

rm ./--help

7
Önemli değil ama bu en "uygun" görünüyor.
James M.

2
Bu hatırladığım şey. "Rm - --help" kullanmak her zaman aramak zorunda olduğum bir şey.
user603 21:10

25
Bu yöntem her zaman --özel olarak davranmayan komutlar için bile çalışır .
jw013

Ve aynı zamanda gibi özel olarak adlandırılmış bağımsız değişkenleri (seçenekler yanında) diğer türleri için bazı komutlar tarafından özel muamele önlemek için çalışır -metin araçlardan ya cd, foo=barof awk...
Stéphane Chazelas

1
Bu, bir dosya rm -- <filename>olmadığı yerde, tek bir tire ile başladığında çalışır .
StockB

37

findBunu yapmak için kullanın :

find . -name '--help' -delete

Ve bu iyi bir yöntemdir çünkü silinebileceğiniz bu gibi birkaç dosyadan daha fazlasına sahipseniz, önce -deleteseçenek olmadan bulmayı çalıştırarak dosyaların önizleme listesini alabilirsiniz , ardından dosya listesi iyi çalışırsa yine ile -delete.

Aslında, kaçınarak rmlehine find(özellikle ilk önizleme) Birlikte hataları önlemeye yardımcı olacaktır iyi bir alışkanlıktır rm *kaçınılmaz bazı gün ısırır.

Ancak, bu bulgunun tüm alt dizinlerinizde tekrarlanacağını unutmayın; bu nedenle, bunu aşağıdaki gibi bir alt dizin derinlik sınırlamasıyla çalıştırmak isteyebilirsiniz:

find . -maxdepth 1 -name '--help' -delete

bulmayı geçerli dizine sınırlar.


Taşınabilir, findiçine bakmak için dosyaların / dirlerin bir listesini vermeniz gerekir . Yani find . -name.... -deleteve -maxdepthstandart seçenekler de değildir.
Stéphane Chazelas

21

Vegar Nilsen ve edfuh'un cevapları çok iyi ve buna benzer bir sorunun çözümü.

Zor bir dosya adı olan herhangi bir dosyayı silmenizi sağlayan bu soruya genel bir yanıt eklemek istiyorum . İlk olarak inode numarası ls -iveya bir form kullanılarak elde edilir statve ardından geçerli dizindeki dosyaları inode numarası ile arayarak ve rmkomutun üzerinde eşleşen bir inode numarasıyla çalıştırılarak dosya kaldırılır.

find . -inode <inode> -exec rm {}\;

İnode sayıları her dosya sisteminde benzersiz olduğundan, bunu kullanarak herhangi bir dosyayı kaldırabilirsiniz; unicode veya kaçış karakterlerini kullanma. Bu kadar yazı yazmak ne kadar sinir bozucuydu, bu yüzden satırı eklemeyi tavsiye ederim.

TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards

.inputrcbash kullanıyorsanız , dosyanıza kaydedin . Bu, olası tamamlamaların listesi arasında geçiş yapmanızı sağlar ( daha fazla bilgi için ).


5
Bu yolun iki sorunu var: 1) -delete kullanabildiğiniz zaman -exec rm kullanmayın; 2) find -name '--help' -delete
inode'u

Bunun işe yarayacağını sanmıyorum. Mevcut dizindeki tüm dosyaları ve tüm alt dizinleri erişir ve bu sonuçta hala çağırır rm --helphala dosyayı kaldırmaz, hangi. Sadece kullanın rm ./--help(veya rm -i *.
Keith Thompson

1
@KeithThompson findtüm dosyalara komut satırı argümanı yolunu önek, bu nedenle aday olacağını rm ./--helpve rm ./sub/dirs/--help. -maxdepth 1İkinciyi düzeltmek için, bir tane eklemek zorunda kalacaksınız, ancak bunların tümü @ edfuh'un çözümünü daha dolambaçlı, kıvrımlı bir şekilde uygulamakta ve her -deletezamankinden daha güvenlidir -exec rm.
jw013

1
Bu komutun bir başka sorunu da {}ve arasında bir boşluk olması gerektiğidir \;, aksi halde işe yaramaz.
Eugene S

inodes benzersiz olabilir, ancak aynı inode ile birkaç tane dizin girişi olabilir. Bunlara hardlink denir. Ve sadece dosya sistemi başına benzersizdir, bu yüzden kullanmanız gerekir -xdev. Bu onu çalıştırmana yardımcı olmaz ls -i --help.
Stéphane Chazelas

11

Acımasız bir çözüm:

perl -e "unlink '--help' or die 'Could not unlink.';"

perl -e "rmdir '-d' or die 'Could not rmdir.';"

8

Linux Kısa çizgiler ve boşluklarla bir dosya oluşturma, ardından kaldırma.

DİKKATLİ OL! Yanlışlıkla bir rm -rf /veya benzeri bir cascade delete komutunu çalıştırmayın .

Kaldırmaya çalıştığınız dosyanız yıldız işaretleri veya eğik çizgiler içeriyorsa, yanlışlıkla işletim sisteminizi silebilecek bir .veya /*veya *veya başka bir joker karakterini pompalamayın .

"--Yo yo" adlı bir dosya oluşturun.

eric@dev ~ $ touch -- "--yo yo"
eric@dev ~ $ ls
bin  --yo yo

İlk önce, onu bul ile bul:

eric@dev ~ $ find . -name "*--yo yo*"
./--yo yo

SADECE find komutunun silmek istediğiniz TEK dosyayı bulduğundan emin olun:

Sonra bulmak, silmek için -delete seçeneğini iletin:

eric@dev ~ $ find . -name "*--yo yo*" -delete
eric@dev ~ $ ls
bin  

Aaaannd gitti.


2

Midnight Commander ( mc) en kolay olanı, sadece işaret et ve F8;)


3
OP bir komut satırı (CLI) çözümü istiyor.
Francesco Turco

1
Gece Yarısı Komutanı bir CLI çözümüdür. Sadece paket yöneticinizi kullanarak kurun. (Hatta ssh üzerinde çalışır ...) en.wikipedia.org/wiki/Midnight_Commander
daviewales 20:13 '

6
apt-get install mc || yum install mc; mc Çeşitli ok tuşları ve F8'den daha kolay nasıl rm ./--help?
Josh,

3
@daviewales: Midnight Commander komut satırından başlatılır ve terminalde çalışır , ancak Midnight Commander içindeki tüm klavye işlemleri CLI'den (Komut Satırı Arabirimi) değil - Midnight Komutanının Arabirimi'ndendir. - Tipik olarak, komut satırı yardımcı programları bir komut dosyasında çalıştırılabilir (istisna bash komut satırı
geçmişidir

1

İşte bu konuyu bulmadan önce kullandığım bir çözüm. dizini 'düzenlemek' için
kullanın vim:

vim .

sonra (vim cinsinden) dosyanızı seçin, del tuşuna basın ve silme işlemini onaylayın.
işin bitince vim ile çıkmak:q


0

Dizin adını önek olarak eklemeye çalıştınız mı:

$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste

Dizini genel olarak dosyanın öneki olarak kullanmak, "eksi" karakterinin ayrıştırıcı işlev tarafından bir komut seçeneği olarak yanlış yorumlanmasından kaçınılmasına yardımcı olur.


1
Bunun zaten daha önceki bir cevapta ele alındığına inanıyorum .
Kusalananda

-3

Dosyayı yeniden adlandırmak istiyorsanız -.bar, (mv çalışmayacak), şunu deneyin:

cat >foo.bar <-.bar

komutu kullanmadan önce:

rm -- -.bar

Orijinal dosyanın içeriğini foo.bar'da inceleyebilmelisiniz


4
Dosyanın bir kopyasını almak, onu yeniden adlandırmak için çok etkili bir çözüm değildir.
jw013

1
Vidir kullanabilirsiniz; ama bu muhtemelen sadece (veya hatta daha fazla) verimsiz - ve çok daha tehlikeli.
Stephen Menasian
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.