Soru FreeBSD: Dizini ^ C (gerçekten!) Denir - nasıl kaldırılır?


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) denen bir dosyam var !! Kullandigimda ls Sadece bir soru işareti görüyorum (büyük olasılıkla yerel ayardan dolayı mı?)

% 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. denerim mv ve sekme tamamlandığını kullanırken bana gösterir:

% mv
^C/  bin/

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


128
2018-01-21 15:55


Menşei


Bu çok kötü dsw POSIX'e dönüştürmedi. - Mark Plotnick
@MarkPlotnick: çok kötü orijinal  dsw POSIX'e dönüştürmedi. - Matteo Italia
Ctrl + C adını verdiğinizi sanmıyorum, muhtemelen bu klavye kısayoluna eşlenen ascii karakterinden sonra, yani ETX (ascii 3) adını verdiniz. Konsol yazı tipinizde bu karakter için hiç bir glif yoktur, bu nedenle jenerik bir yer değiştirme glifini "?" Kullanır. - jiggunjer
emacs -nw -f dired bir dizin navigator verir. <kbd> D </ kbd>, onaydan sonra imlecin altındaki dosyayı siler. - Thorbjørn Ravn Andersen
@MatteoItalia Dosya isimleri ve diğerlerinde çok kötü kontrol karakterleri var aptalca  fikirler POSIX’te ... - pipe


Cevaplar:


^V (ctrl+v), normalde ilişkilendirilecek eylemi almak yerine, bir sonraki tuşa basmak için birleşik bir kaçış dizisi olarak çalışır.

Bunu kullanmak, ^V^C (ctrl+v, ctrl+c) terminalde zor dosya adınızı girmek için çalışmalıdır.


189
2018-01-21 16:23



Muhtemelen OP yazım hatalarını ilk sırada nasıl yapıyordu? V ve C, klavyede yan yanadır. - Stig Hemmer
Ya da bsd terminalindeki Windows panosunu kullanmaya çalışıyorlardı. - Joel Coel
@JoelCoel alışkanlıkları asla ölmez! - Mafii
İlginçtir, ^V^C yapar değil Zsh line editöründe çalışmak; alıntılanan-insert Widget (için sayfayı arayın ^V) açıkça kesik karakterler eklemez. Jakob'un cevabı (printf kullanarak) kabuk argümanında bir kontrol karakteri sağlamanın daha taşınabilir bir yolu olabilir. - Miles
@StigHemmer: Bir komutun ortasında Ctrl-C tuşlarına bastığınızda, bunu unutun ve daha sonra komutu kopyalayıp yapıştırın. - Mehrdad


Dosyayı inode ile de kaldırabilirsiniz:

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

Ne yaparsan yap, Tanrı aşkına, koymayın -delete önce -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, yeni silindi herşey dosyalarınız İle find, argüman sırası önemlidir!


89
2018-01-22 03:42



Neden koymuyor -delete önce -inum? Bu, sadece erken basarsanız veya argümanların sırasının sonucu gerçekten etkilediği durumda bir önlem midir? - detuur
@detuur: sipariş sonucu etkiler. Düzenleme konusuna bakın. - bishop
Koyma -delete Komutu sürece -delete ne istediğini bulup bulmadığını kontrol etmek için. - Kaz
@Kaz, komutun ortasında -delete ekleyerek çok yardımcı olmaz - RiaD
@Kaz kullanarak -print yerine -delete çok iyi bir test yapar. - Mark Ransom


Başka bir seçenek kullanmaktır rm -ri ./*; rm herhangi bir dosya ve dizini silmeden önce size soracaktır, böylece sadece cevaplamanız gerekir y "kötü" dosyaya ve n Diğerlerine.

Aslında, sizin durumunuzda, ihtiyaç duyduğunuz cevap sayısını bile azaltabilirsiniz. rm -ri ./?senin "kötü" dosyanız sadece bir karakter uzunluğunda olduğu için.


31
2018-01-21 20:13



select f in ?; do rm -i "$f"; break; done tüm faydaları vardır -icevap vermek zorunda olmaksızın no İstenmeyenleri yönlendirmek ya da tutmak istediğiniz birine evet cevabını vermek. - bishop
OP durumunda, bir dosya değil, bir dizin. rmdir ?/ tüm boş tek karakterli dizinleri kaldıracak ve diğerlerinin boş olmadığından şikayetçi olacak. - Peter Cordes
@bishop: whoa, bunu bile bilmiyordum select var, oldukça düzgün! - Matteo Italia
@PeterCordes: wops, dizinlerden söz ettiğimizi fark etmedim; ekledim -r (ve ./ - ne yazık ki, benim örneklerime, her zaman unutmak kolay rmdir desteklemiyor -i bayrağı. Yine de, bu durumda en iyi yolun, piskoposun ve yorumunuzun bir bileşimi olacağını düşünüyorum. - Matteo Italia
@MatteoItalia select sadece bazı kabuklarda bulunur, bu da muhtemelen buna katılmamanızdır - taşınabilir olması amaçlanan komut dosyaları ve çözümler bunu önler, bu yüzden onu "vahşi" olarak görmemiz daha az olasıdır. - mtraceur


Bir seçenek, dosya adını başka bir şeyle aramaktır. ls. Eğer bir verbatim tarafından üretildiğini biliyorsan Ctrl+Ckullanarak üretilen ASCII karakterini bulabilirsiniz. kontrol karakterleri tablosuveya Python tarafından sağlanan gibi daha samimi bir arayüzle:

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

Başka bir seçenek, çıkışının bir hex dökümüne bakmak olabilir. lskullanarak, ör. hexdump.

Ardından dosyayı (örneğin) bu bash komutunu kullanarak silebilirsiniz:

rmdir "$(printf '\x03')"

(Çift tırnak sadece, yazdırmaya çalıştığınız karakter sizin içinse gereklidir. IFS gibi değişken \x20 veya \x0Aancak kabukların alan ayırma işlemini gerçekleştirmesini istemediğiniz sürece, komut ikamelerini alıntılamak iyi bir alışkanlıktır.)


23
2018-01-21 18:51



Ayrıca cat -v (artı man ascii) ilk kısım için yardımcı olabilir. - Matteo Italia
... ya sen kullanıyorsun os.rmdir('\x03') doğrudan Python kabuğundan. - moooeeeep


Çoğu zaman bu tür durumlarda bir araya gelmek kolaydır joker desen ilgili dosyayla eşleşiyor.

Senin durumunda, bu basitçe olurdu ? (tüm dosya adlarını tam olarak bir karakterle eşleştirerek).

Sadece ne istediğinizle eşleştiğini kontrol edin:

ls -ld ?

Ve sonra dizini kaldırın:

rmdir ?

Bunu ile de birleştirebilirsiniz sekme tamamlama. Yazabilirsin

rmdir ?

ve sekmesine basın, ör. bash ile değiştirilecek

rmdir ^C/

ve daha sonra enter tuşuna basabilir ve istediğini yapar.


15
2018-01-21 21:02





Dosyayı silmek için Midnight Commander'ı (mc) kullanabilirsiniz - sadece yukarı / aşağı tuşlarıyla seçin ve F8 tuşuna basın.

Dosya adlarının kodlama nedeniyle tuhaf karakterleri olduğunda bazen bunu yaptım.


11
2018-01-21 20:29



Ya da başka herhangi bir dosya yöneticisi hakkında. - Stig Hemmer
@StigHemmer elbette, bazıları bazı dosya isimlerini görüntülemek için diğerlerinden daha iyi. Muhtemelen cevap, MC'nin neden birkaç tane diğerine kıyasla en uygun seçim olduğunu açıklayabilir. Bilmiyorum, hiç kullanmadığım gibi. - can-ned_food


Yine başka bir yol: kullanım stat dizin adının kaçan bir temsilini almak için:

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

Artık dosya isminin bir temsilini biliyorsunuz, böylece dosyayı isme göre adlandırabilirsiniz. printf:

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

Ya da, bash kullanıyorsanız, önleyebilirsiniz printf:

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

7
2018-01-22 10:25



Kabuk bash ise BTW $'\x03' printf çağırmaktan daha kolaydır. Bazı lezzetli özellikleri ile POSIX kabuk üzerinde genişletilmiş FreeBSD sh için aynı. - Netch
@Neth hakkında iyi bir nokta $'...'Ancak, genel olarak sekizlikten onaltılık değere dönüşümsüz dönüşümden kaçınacağım. Örneğin. dosya adlandırılmışsa '\111' (içinde stat çıktı)? Hala onu kullanarak kaldırır mısınız $'\x49'? İle aynı diziyi daha iyi kullanın stat size verdi: OP'nin durumunda, rmdir $'\003'. - Ruslan


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.

Ama sen sahip olmalısın gerekli ayarlar Çalışmak için kabuğunda.


6
2018-01-22 08:31



^ C sekme dizisinde gerçekten erken, bu yüzden sizin için +1. - joshudson


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


5
2018-01-21 16:31



Bu size kabul edilen cevaptan daha kolay geliyor mu? - chicks
@chicks: Aslında bu kadar kötü bir cevap değil. ^ V ^ C'yi görmedim, böylece birisi sıkıştırabilir. - joshudson
Kendi başına değil, daha doğrudan çözümlere kıyasla çok fazla iş gibi görünüyor. Belki de Linux tarafından şımartıldım ama ^v yaş için sürekli olarak çalıştı. - chicks
@chicks ^V Dosyaları taşırken ve ana dizinin kaldırılması sırasında belirli bir bilgiye gereksinim duyulması temel bilgilerden türetilebilir. - Kondybas
Ctrl + V, tam çalışma ortamınıza bağlı olarak tehlikeli bir şekilde muğlaktır. Bazı terminal emülatörleri bunu macun olarak yorumlayabilir. Yapıştır arabelleğiniz silmek istemediğiniz bir şeyin adını içeriyorsa - ve bir satırsonu, bir sorunla karşılaşıyor olabilirsiniz. - rackandboneman