FreeBSD: Directory denilen ^ C (gerçekten!) - nasıl kaldırılır?


127

Bir yazım hatası yaptım:

$ history
169 9:34    la /usr/local/etc/
170 9:35    sudo mkdir ^C
171 9:36    sudo mkdir /usr/local/etc/dnsmasq.d

Şimdi ^ C (ctrl + C) denilen bir dosya var! Kullandığımda lssadece bir soru işareti görüyorum (muhtemelen yerel ayar nedeniyle?)

% ls -al
total 60
drwxr-xr-x  2 root   wheel    512 Jan 21 09:35 ?        <- this one
drwxr-xr-x  5 admin  wheel    512 Jan 21 16:24 .
drwxr-xr-x  3 root   wheel    512 Jan 20 14:29 ..
-rw-r--r--  1 admin  nobody  1114 Jan 20 19:10 .cshrc
-rw-------  1 admin  wheel   6002 Jan 21 15:27 .history
-rw-r--r--  1 admin  nobody   182 Jan 20 14:29 .login
-rw-r--r--  1 admin  nobody    91 Jan 20 14:29 .login_conf
-rw-------  1 admin  nobody   301 Jan 20 14:29 .mail_aliases
-rw-r--r--  1 admin  nobody   271 Jan 20 19:04 .mailrc
-rw-r--r--  1 admin  nobody   726 Jan 20 19:05 .profile
-rw-------  1 admin  nobody   212 Jan 20 14:29 .rhosts
-rw-r--r--  1 admin  nobody   911 Jan 20 19:06 .shrc
drwx------  2 admin  nobody   512 Jan 20 15:05 .ssh
drwxr-xr-x  2 admin  wheel    512 Jan 20 19:08 bin

ve

% ls -i
3611537 ?   3611534 bin

Bu dosyayı kaldırmak istiyorum. Deniyorum mvve tab-tamamlamayı kullanırken bana şunu gösteriyor:

% mv
^C/  bin/

Açıkçası bir ^ C: - / yazamıyorum Bu dosyayı nasıl kaldırabilirim?



12
@MarkPlotnick: çok kötü orijinal POSIX içine bulmadı. dsw
Matteo Italia,

4
Ctrl + C olarak adlandırdığınızı sanmıyorum, bu klavye kısayoluyla eşleştirilen ascii karakterinden sonra adlandırdınız, yani muhtemelen ETX (ascii 3). Konsol fontunuzda o karakter için glif yok, bu nedenle "?" Genel bir değiştirme glifi kullanıyor.
jiggunjer

5
emacs -nw -f diredbir rehber gezgini verir. <kbd> D </kbd>, onaylandıktan sonra imlecin altındaki dosyayı siler.
Thorbjørn Ravn Andersen

9
@MatteoItalia Dosya adlarında çok kötü kontrol karakterleri ve diğer aptalca fikirler POSIX'in içine girdi ...
pipe

Yanıtlar:


188

^V( ctrl+ v) sonraki tuş basışı için bir tür kaçış dizisi olarak çalışır, normalde ilişkilendirilecek herhangi bir işlemi yapmak yerine ilgili değeri girer.

Bundan yararlanarak, ^V^C( ctrl+ v, ctrl+ c) zor dosya adınızı terminale girmek için çalışmanız gerekir.


41
Muhtemelen OP ilk başta onların yazım hatası yaptı. V ve C klavyede yan yana.
Stig Hemmer,

14
Veya bsd terminalindeki Windows panosunu kullanmaya çalışıyorlardı.
Joel Coel

2
@JoelCoel alışkanlıkları asla ölmez!
Mafii

1
İlginçtir, ^V^Cyok değil Zsh çizgi editörü çalışmak; alıntılanan-insert Widget (için sayfa arama ^V) açıkça kesme karakterleri eklemez. Jakob'un cevabı (printf kullanarak), kabuk bağımsız değişkeninde kontrol karakteri sağlamanın daha taşınabilir bir yolu olabilir.
Mil

@StigHemmer: Aynı zamanda, komutun ortasındaki Ctrl-C tuşlarına basmanız, ardından bunu unutmanız ve komutu daha sonra kopyala yapıştırmanızdır.
Mehrdad

89

Ayrıca dosyayı inode ile kaldırabilirsiniz:

$ ls -i1
290742 foo
293246 ^C
$ find . -inum 293246 -delete

Ne yaparsanız yapın, Tanrı aşkına, daha -deleteönce koymayın -inum:

$ touch foo bar baz quux
$ find . -name '*u*' -delete
$ ls
bar baz foo
$ find . -delete -name 'b*'
find: `./baz': No such file or directory
find: `./bar': No such file or directory
$ ls
$ 

Tebrikler, tüm dosyalarınızı sildiniz . İle find, argüman sipariş konularda !


2
Neden daha -deleteönce koymadın -inum? Önceden enter tuşuna basmanız durumunda bu bir önlem mi yoksa argümanların sırası sonucu gerçekten etkiliyor mu?
detuur

10
@detuur: sipariş sonucu etkiler. Düzenlemeye bakınız.
Piskopos

37
Ne -deleteistediğini bulmadığını -deletekontrol etmeden komutu çalıştırmadan önce komuta girmeyin .
Kaz

2
@Kaz komuta merkezine -delete eklemek konusunda pek yardımcı olmayacak
RiaD

9
@Kaz -printyerine -deleteçok iyi bir test yapar.
Mark Ransom

32

Başka bir seçenek kullanmaktır rm -ri ./*; rmHerhangi bir dosya ve dizini silmeden önce size soracak, bu nedenle y"kötü" dosyaya ve ndiğerlerine cevap vermeniz yeterli olacaktır .

Aslında, sizin durumunuzda rm -ri ./?, "kötü" dosyanız yalnızca bir karakter uzunluğunda olduğundan, yapmanız gereken yanıt sayısını azaltabilirsiniz .


8
select f in ?; do rm -i "$f"; break; done-iÖnemsiz noistenmeyenlere cevap vermek zorunda kalmadan veya saklamak istediğiniz birine yanlışlıkla yanlış cevap vermenin verdiği tüm faydalara sahiptir .
Piskopos

6
OP'nin durumunda bu bir dosya değil bir dizindir. rmdir ?/tüm boş tek karakterli dizinleri kaldıracak ve diğerlerinin boş olmadığından şikayet edecektir.
Peter Cordes

2
@ bishop: vay, bunun selectvarolduğunu bile bilmiyordum , oldukça temiz!
Matteo Italia,

@PeterCordes: wops, dizinlerden bahsettiğimizi fark etmedim; Örneklerime ekledim -r(ve ./- her zaman unutmak kolaydır). Maalesef bayrağı rmdirdesteklemiyor -i. Yine de, bu durumda gidilecek en iyi yolun piskoposun ve senin yorumunun bir birleşimi olacağını farz ediyorum.
Matteo Italia,

1
@MatteoItalia selectsadece bazı mermilerde var, bu yüzden muhtemelen içine girmediniz - taşınabilir olması amaçlanan senaryolar ve çözümler bundan kaçınıyor, bu yüzden onu "vahşi doğada" görmemiz daha az olası.
mtraceur

23

Seçeneklerden biri dosya adını başka bir şeyle aramaktır ls. Bir verbatim Ctrl+ tarafından üretildiğini biliyorsanız C, bir kontrol karakterleri tablosu kullanarak veya Python tarafından sağlananlar gibi daha kullanıcı dostu bir arayüz kullanarak üretilen ASCII karakterini bulabilirsiniz :

>>> import os
>>> os.listdir('.')
['\x03', ...]

Başka bir seçenek lsörneğin kullanılarak çıktının onaltılı dökümüne bakmak olacaktır hexdump.

Sonra dosyayı (örneğin) bu bash komutuyla silebilirsiniz:

rmdir "$(printf '\x03')"

(İkili tırnak işaretleri, yalnızca yazdırmaya çalıştığınız karakter IFS, \x20veya gibi değişkeninizde ise \x0A, ancak kabuğun alan bölmesini gerçekleştirmesini istemediğinizi bilmediğiniz sürece, komut değiştirme işlemi yapmak iyi bir alışkanlıktır.)


2
Ayrıca cat -v(artı man ascii) ilk bölüm için yardımcı olabilir.
Matteo Italia

13
... ya da os.rmdir('\x03')doğrudan Python kabuğundan kullanıyorsunuz.
moooeeeep

15

Genellikle bu tür durumlarda , ilgili dosyaya uyan bir joker desen bulmak kolaydır .

Sizin durumunuzda, bu basit olacaktır ?(tüm dosya adlarını tam bir karakter ile eşleştirmek).

Sadece gerçekten istediklerinize uyduğunu kontrol edin:

ls -ld ?

Ve sonra dizini kaldırın:

rmdir ?

Bunu sekme tamamlama ile de birleştirebilirsiniz . Yazabilirsin

rmdir ?

ve tab tuşuna basın, örneğin bash, bunun yerine

rmdir ^C/

ve sonra enter'a basabilirsiniz ve istediğinizi yapar.


11

Dosyayı silmek için Midnight Commander (mc) komutunu kullanabilirsiniz - sadece yukarı / aşağı düğmelerini kullanarak seçin ve F8 tuşuna basın.

Bunu bazen dosya adlarının kodlama nedeniyle garip karakterleri olduğunda yaptım.


4
Ya da hemen hemen başka bir dosya yöneticisi.
Stig Hemmer,

Elbette @ StigHemmer, bazı dosya adlarını görüntülemek için bazıları diğerlerinden daha iyi sonuç verir. Muhtemelen cevap, MC'nin neden birkaç seçilmiş kişiye kıyasla optimal bir seçim olduğunu açıklayabilir. Bilmiyorum, hiç kullanmadığım gibi.
can-ned_food, 6

7

Yine başka bir yol: statDizin adından kaçan bir gösterim almak için kullanın :

$ stat *|grep File:
  File: ‘\003’

Artık dosya adının bir gösterimini biliyorsunuzdur, böylece dosyayı kullanarak adıyla kaldırabilirsiniz printf:

$ rmdir -v "$(printf '\003')"
rmdir: removing directory, ‘\003’

Veya, bash kullanıyorsanız, şunları önleyebilirsiniz printf:

$ rmdir -v $'\003'
rmdir: removing directory, ‘\003’

BTW, kabuk bash ise $'\x03', printf çağırmaktan daha basittir. Aynı, bazı lezzetli özelliklerle POSIX kabuğuna genişletilen FreeBSD sh için de aynıdır.
Netch

@ Bash hakkında iyi bir noktaya değin $'...', fakat genel olarak sekizlikten onaltılık düzeye çevrilmekten kaçınırdım . Örneğin, eğer dosya isimlendirilmişse '\111'( statçıktıda)? Kullanarak hala kaldırır $'\x49'mısın? statSize verilen dizinin aynısını kullanın : OP'nin durumunda rmdir $'\003',.
Ruslan

6

Benim için çalışan bir çözüm:

rm ./[Tab][Tab][Tab]...

Kaldırmak istediğimi bulana kadar mevcut dosyalar arasında geçiş yapmak için.

Fakat bunun çalışması için kabuğunuzda gerekli ayarların olması gerekir.


^ C sekme dizisinde gerçekten erken yani sizin için +1.
joshudson

5

En kolay yol, her şeyi geçici dizine taşımak rm -r DIRNAME.


7
Bu sizin için kabul edilmiş cevaplardan daha kolay görünüyor mu?
civcivler

2
@ chicks: Aslında o kadar da kötü bir cevap değil. Görmedim ^ V ^ C çalışmıyor, böylece biri sıkışmış olabilir.
joshudson

Kendi başına yanlış değil, ancak daha doğrudan çözümlere kıyasla daha fazla iş gibi görünüyor. Belki Linux tarafından şımartılmışım, ama ^vsürekli olarak benimle yıllarca çalıştı.
civcivler

6
@ chicks, ^Vdosyaları dolaştırırken belli bir bilgiye ihtiyaç duyar ve ana dizinin çıkarılması temellerden elde edilebilir.
Kondybas

5
Ctrl + V, çalışma ortamınıza bağlı olarak tehlikeli bir şekilde belirsizdir ... bazı terminal emülatörleri bir macun olarak yorumlayabilir. Yapıştırma tamponunuzda silmek istemediğiniz bir şeyin adı ve yeni bir satır varsa, bir soruna bakıyor olabilirsiniz.
rackandboneman

1

Yalnızca boş dizinse (veya diğer boş dizinleri kaldırmayı umursamıyorsanız), kullanınrmdir */ . rmdirBoş olmayan dizinleri kaldıramadığınız hakkında hata mesajları alacaksınız , ancak sorun değil. GNU rmdirdestekliyor --ignore-fail-on-non-empty, yoksa yapabilirsin 2>/dev/null.

Sondaki /glob sadece dizin adlarıyla eşleşen yapar.

Kullanmakta olduğunuz mevcut dizin altında hangi boş dizinlerin bulunduğunu önceden kontrol edebilirsiniz
find -maxdepth 1 -type d -empty -ls. (Ve değiştirebileceğiniz -lsiçin -deleteİstersen).

rmdir [^A-Za-z0-9._]/Alfanümerik olmayan veya alt çizgi dosya adıyla başlayan dizinleri eşleştirmek gibi daha spesifik bir glob ifadesi kullanabilirsiniz . Ben de .ekledim, ancak glob ifadeleri .zaten normal şekilde eşleşmiyor .


Diğerlerinin de belirttiği gibi, şunu bir glob ile tek karakterlik isimlerle sınırlayabilirsiniz ?: rmdir ?/

rmdirboş bir dizin genellikle değerli olmadığından ve sadece yeniden oluşturulabildiğinden, muhtemelen böyle bir -iseçeneğe sahip değil rm.


1
Hangi dizinleri yeniden oluşturmak istediğinizi bilmek istersiniz ve seçeneğe rmdirgeçip -vgeçmediğinizi (en azından GNU'da) söyleyebilirsiniz .
Ruslan

@Ruslan: Artık umursamadığınız başka eski dizinleriniz olmasaydı ve bunları kaldırmak bir bonus olurdu. Sen boş dizinleri için görünebilirfind -maxdepth 1 -type d -empty -ls
Peter Cordes

-1

Riskli bir şey yapmadan önce, önce bunu deneyin:

rmdir -- ^C

Genel olarak - no ption'ların izlemeyeceği komutuna bir sınırlayıcıdır, ancak garip karakterlerin başka bir şey olarak yorumlanmamasına da izin verir.

Başka bir kullanım örneği whois -r -- "-r OBJECT-RIPE"

(-r olgun için bir kısayol, ancak olgun whois'te de bir parametredir)

İlk denemede işe yaramazsa, o zaman belki deneyin rmdir -- "^C"

Ama benim csh kabuğumda hiçbirine ihtiyacım yok, rmdir ^Czaten benim için çalışıyor.


1
Csh yazarken rmdir <ctrl> C çalışıyor mu? Gerçekten mi?! rmdirKomutun iptal edilmesi ve sizi komut satırına geri döndürmesi gibi farklı davranmasını bekliyorum .
Mausy5043

Gerçekten olacak. Komut satırında ^ C karakterinin nasıl girileceği ile ilgili kabul edilen cevaba bakın.
Ale
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.