Linux'ta, adı “-” gibi SADECE tire olarak görünen bir dosyayı nasıl kaldırırım?


33

denedim

rm -- -
rm "-"
rm "\-"
rm \-

Perl'e bir şans verdi

~$ perl -e '$junk = glob("-"); chomp $junk; print "$junk\n"; `rm $junk`;'
-
rm: cannot remove `-': No such file or directory

...ve...

~$ perl -e '$junk = glob("-"); chomp $junk; print "$junk\n"; `mv $junk newfile.garbage`;'
-
mv: cannot stat `-': No such file or directory

Her türlü yardım çok akıllıca olacaktır.


Meraktan, oraya nasıl gitti?
Petey B,

2
Kötü yapılandırılmış bir wget'in sonucuydu : "wget ​​-q -O - someserver.org/s/ip "

53
Bir meslektaşımın * adlı bir dosya yarattığı zamanı hatırlatıyor. Bu hikaye iyi bitmedi.
David Heffernan

Hangi rmsürümü kullanıyorsunuz ( rm --version)? rm -GNU coreutils 8.5 ile iyi çalışır.
Lekensteyn

2
Başka bir değişken:rm ./-
CVn

Yanıtlar:


60

Bu, Unix için Usenet Sıkça Sorulan Sorular bölümlerinde yayınlanmıştır - GNU Core Utility SSS'lerinde olduğunu görüyorum . En az beş farklı yöntem vardı, ancak bu iyi çalışıyor:

$ rm ./-

Bir dosya adı değişken olmayan karakterler içeriyorsa, şunları kullanın:

$ rm -i *

-iKaldırılamaz veya olmasın gerekip gerekmediğini bayrak her dosya için onay alır.


1
Veya rm -i - ' - ' bir çizgi ve belki biraz boşluk veya başka bir dosya içeren dosyaları arıyorsanız.
Hans-Peter Störr 21:11

1
rm -i * ayrıca benim için çalıştı. Teşekkürler wallyk!
jgrundstad

39

Adları ile başlayan bir dosyayı kaldırmak bir -SSS'dir, ancak farklı bir sorununuz var gibi görünüyor.

Soruda bahsettiğiniz çözümlerden:

rm -- -

Bu çalışması gerekir.

rm "-"

Bundan farklı değil rm -. Tırnaklar kabuk tarafından çıkarılır ve rmkomut sadece tek tireyi argüman olarak görür. Tırnak işaretleri, kabuk meta karakterlerinden kaçmak için kullanışlıdır; tire, rmkabuk için özel değildir.

rm "\-"

Tırnak işaretleri ters eğik çizgiden kaçar, bu nedenle adı iki karakterden oluşan bir dosyayı, ters eğik çizgiyi ve kısa çizgiyi kaldırmaya çalışır.

rm \-

Bu da rm "-"aynı şekilde rm -.

Olduğu gibi, en azından GNU coreutils sürümüyle birlikte rm, rm -adı yalnızca kısa çizgi içeren bir dosyayı gerçekten kaldırır (veya kaldırmaya çalışır). Dosyanızın adı bu olsaydı, şimdi gitmiş olurdu. Dosyanızın yalnızca kısa çizgi gibi görünen bir adı olduğuna karar verdim .

ls | cat -A

gerçekte ne denildiği hakkında bir fikir vermeli.

İşte şimdi birlikte attığım bir Perl betiği, geçerli dizindeki her dosya için sizden bilgi isteyip istemediğinizi soracaktır. Garanti olmadan sunulur, ancak kısaca test ettim.

#!/usr/bin/perl

use strict;
use warnings;

$| = 1;

opendir my $DIR, '.' or die ".: $!\n";
my @files = sort grep { -f $_ } readdir $DIR;
closedir $DIR;

foreach my $file (@files) {
    print "Remove $file? ";
    my $answer = scalar <>;
    if ($answer =~ /^[Yy]/) {
        unlink $file or warn "$file: $!\n";
    }
    elsif ($answer =~ /^[Qq]/) {
        exit 0;
    }
}

EDIT : Daha az ayrıntılı bir çözüm: Eğer dosyanın adı sadece bir karakterse, rm ?onu kaldırmalısınız (diğer dosyalarla birlikte).


13
M-bM-^@M-^S0x2013 numaralı Unicode "EN DASH" karakterinin 3 baytlık UTF-8 gösterimidir. Bir web sayfasından yanlışlıkla kopyalayıp yapıştırıp yapıştırmadığınızı merak ediyorum.
Keith Thompson

7
did rm -i *çalışmıyor? Perl betiği ile aynı şeyi yapar gibi görünüyor.
user606723

2
Tahminim, yazdığım web sayfasından kaynaklanmış. Her durumda, kapsamlı çözüm için tekrar teşekkürler! Kendine iyi bak.
jgrundstad

5
perl -e 'unlink grep {print "kaldır $ _?"; <STDIN> = ~ / y / i} glob "*" '
Randal Schwartz

6
@RandalSchwartz: Etkileyici veciz (beynim biraz zarar yapar) - fakat istediğimiz /^y/iyerine /y/i. Sonuçta, bir Rus kullanıcı "Nyet" yazabilir.
Keith Thompson

19

Daha güvenli bir şey istiyorsan ...

Ls ile bulmayı kullanmayı deneyin (bu, kaldırma izniniz olan herhangi bir dosya için işe yarar)

'-İ' parametresi, ls -li dizindeki her giriş için inode numarasını verecektir.

27 ----------  1 owner  group       3981 Oct 11 04:42 ?????

İnode numaranız olduğunda ...

find . -inum **27** -exec rm -i {} \;

2
Bu +1, bu sorunlara genel bir cevaptır. Bu arada son keşiflerde -exec rm kullanmanıza gerek yok, sadece -delete kullanın
Sirex

2
@Sirex - Ben noktası düşünüyorum -exec rm -i {}olduğu -ikaldırılması için istemi. Bakıyorum man findve bunu yapmanın bir yolunu görmüyorum.
Stephen P

oh evet, bu durumda. daha bir ipucuydu.
Sirex

13

Ver rm ./-bir deneyin.

-Bir bayrak tartışma başlatmak için bayrağıdır. Argümanı a dışında herhangi bir şeyle başlatırsanız, -bu durumda /, bunun dosya adı olduğunu varsayar. Hangisi istersen bu.

Beri fileve ./fileaynı dosya vardır, bu adlı dosyayı hedefleyecektir -yoluyla ./-.


8
30 karakter yazmak yerine, belki / niçin doğru şekilde ayrıştırmaya yardımcı olduğunu açıklamak daha faydalı olurdu
Ivo Flipse

@gcb Önerilen düzenleme için teşekkürler. Buna kod biçimlendirme ekledim, bu yüzden okunması daha kolay olurdu.
slhck

7

Diğer cevapların çoğu kadar meraklı değil, ama mcgece yarısı komutanının bir örneğini ateşlerim ve dosyayı seçip silerim.


Konuyu zekice yana adımlamak için +1 - ve bir GUI programına başvurmadan bile.
sleske,

7

Deneyin:

$ ls -b

Dosya adının yazdırılamayan karakterleri olup olmadığını görmek için


Neden aşağı oy? Verilen Takibinizi , bu sesler çok iyi öneri gibi.
Ilmari Karonen

6

Perl kullanmanız gerekli değil ama bu işe yaramalı:

perl -e 'unlink "-"'

veya yukarıdakilerle ilgili herhangi bir hatanın olabileceğini görmek için:

perl -e 'unlink "-" or die "Err: $!"'

Bu yöntemin, endişelenecek özel karakterlerin olmaması (dizge tırnak işaretleri dışında) avantajı vardır.
Kevin Reid

3

Kötü adlandırılmış dosyaları kaldırmak için GNOME'un Nautilus'unu kullanma konusunda şansım oldu. X sunucusu mu kullanıyorsunuz? Diğer dosya tarayıcılarının da çalışacağına eminim.


3

Eğer

rm -- -

işe yaramadı, dosya adı "sadece kısa çizgi" değil. Başka hiçbir dosyada tire işareti yoksa, deneyebilirsiniz

perl -E'for (@_) { if (/-/) { unlink($_) or die $! } }' -- *

1

Şimdiye kadar bugüne kadar yayınlanan her yöntem için bir "Böyle bir dosya veya dizin yok" alıyorum:

rm ./-
rm -- -
mv "-" test.txt
rm -rf '-' <-- this gives no error, but doesn't work
perl -e 'unlink "-";'  <--also no error, doesn't work.

Görünüşe göre rm 7.4 sürümünü aldım. Bu önerileri yükseltmeyi ve yeniden denemeyi deneyeceğim. Yardımlarınız için herkese teşekkürler.


1
Sanırım böyle bir dosya ya da dizin yok ve belki de dosya adı da görünmez karakterler içeriyor. (ve 'unlink "-" ile perl'de aynı hata mesajını bulabilir veya "Err: $!"' ile ölebilirsiniz). Gerçek dosya adının ne olduğunu görmek için "ls -b" yi deneyin.
runrig

1

diredBu tür bir şey için emacs modunda modunu çok seviyorum - sadece emacs dizininde "açın". Dosyaları kolayca seçebilir ve silmek için işaretleyebilirsiniz.

Gece yarısı komutanı kullanarak önerilen başka bir poster; Bu hemen hemen aynı fikir, ama zaten bir emacs kullanıcısıysanız, belki de daha uygundur.


0

rm -f '-'Benim için cygwin'de çalışabilmeli

Bu konuda, rm -ayrıca kırmızı şapka üzerinde çalışmak gibi görünüyor.


içinde Ubuntu'da: ~ / jj $ rm -rf '-' ~ / jj $ ls -

rm -benim için de çalışıyor.
uzsolt

1
Neden -r? İhtiyacınız yoksa özyinelemeli bir silme istemek, yanlış kullanım durumunda daima tehlikelidir.
Hans-Peter Störr 21:11

@hstoerr, iyi nokta. sadece alışkanlık. eller beyinden daha hızlı yazıyor. yanıt düzenleme şimdi, teşekkürler.
Lucas
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.