Sadece globbing kullanırken `rm`'yi etkileşimli yapabilir miyim? (bash veya zsh veya her ikisinde)


15

rmKabuk globbing ile bir kerede birden fazla ürün bulduğumda ve desenin beklediğimden daha fazla genişlediği en ufak bir olasılık olsa bile, her zaman eklemeyi hatırlamaya çalışırım -i, ancak (elbette) yararlı bir şeyi unutabilir ve yanlışlıkla uçurabilirim. Bazı insanlar bu sorunu bir takma adla çözmeye çalışırlar, alias rm='rm -i'ancak rm'yi her zaman etkileşimli yapma fikrinden nefret ederim , çünkü o -fzaman tüm amacı açık bir şekilde yenecek alışkanlığa gireceğim.

Yapmak istediğim rmsadece -iglobbing kullandığımda kullanmak ve -ftabii ki geçersiz kılmak için -i, bu yüzden her zamanki gibi tüm dizinleri uçurabilirim rm -rf junk.

Bu rm *blah*yüzden gerçekten yazılır rm -i *blah*ama rm blahtam olarak yazıldığı gibi çalışır.

Bunun farklı kabuklarda nasıl başarılabileceği konusunda bir fark olması durumunda , sadece birini veya diğerini kapsayan cevaplar üzerine bash ve zsh için yöntemler sağlayan bir cevap seçeceğim .


Not : Aslında bunun iyi bir fikir olduğuna ikna olmadım; Sadece bunun mümkün olup olmadığını soruyorum. Bunun aptalca bir fikir olduğunu düşünüyorsanız, fikrinizin ardındaki mantığı duymaktan memnuniyet duyarım, ancak lütfen bu tür yorumları cevap alanına göndermeyin . Gerçek cevaplar ya bunu nasıl yapacağımı söyler ya da neden / neden mümkün olmadığını açıklar (ya da muhtemelen benzer bir sonuç almak için alternatif bir yöntem sunar). Ama bana bunun neden aptal olduğunu söylemek istiyorsanız, lütfen yorum olarak gönderin. Sonuca katılmıyorsam bile iyi gerekçeli yorumları iptal edeceğim.


7
Birkaç öneri: GNU yardımcı programları ile, rm -Igibi -iüçten fazla dosya veya sadece tetikleyici -rgeçirilir. İçinde bash, Ctrl-x *glob'u genişletmek ve kendiniz incelemek için klavye kısayolunu kullanın.
jw013

2
Bash ile cevabın "hayır" olduğuna inanıyorum. Zsh ile, noglobörneğin rm'yi yumuşatmak noglob my-rmve sonra my-rm'yi bir glob olup olmadığını denetleyen, genişleten ve -i ileten bir komut dosyası olmaktan yararlanabilirsiniz. Emin değilim, zsh bilmiyorum.
derobert

@derobert: kesinlikle sesi oldukça iyi zsh biliyormuş gibi.
iconoclast

@ iconconlast Hayır, zsh değil, sadece Google. Tuhaf bir şekilde, bunu bash'da nasıl yapacağımı bulmaya çalışırken buldum. :-P
derobert

Eğer rm gibi görünüyor ama aslında farklı bir şey istiyorsanız, ben denilen bir komut dosyası (veya takma ad / işlev / işlev tuşu) yazmalı myrmve bu komut dosyası gibi ne harika şeyler yapalım.
Walter A

Yanıtlar:


9

Kolay değil. Sorun şu ki:

rm -- *.txt

rm, yalnızca kabuk tarafından genişletilmiş olan globbing desenini değil, dosyaların listesini görür.

Yapabileceğiniz şey (zsh):

alias rm='noglob rm'

Bu, zsh'ye rm çağrılırken kalıpların genişletilmemesi gerektiğini söyler. Daha sonra rm'yi genişletmenin kendisini yapan ve gerekirse "-i" ekleyen bir işlev olarak yeniden tanımlayabilirsiniz:

'rm'() {
  [[ "$*" = *[*[?]* ]] && set -- -i "$@"
  command rm $~@
}

Bu yaklaşımla ilgili sorun, bu yeni "rm" arasındaki farkı görmemesi.

rm *

ve

rm '*'

Adlı dosyayı kaldırmak *için şunu yazmanız gerekir:

rm [*]

-1

Bash, muhtemelen diğer kabuklarda çalışır. Yer.bashrc

function rm() { 
  while test "${1:0:1}" = "-"; do 
    shift
  done
  if test $# -eq 1; then 
    command rm "$1"
  else 
    command rm -i "$@"
  fi
}

3
command rmSabit kodlamayı önlemek için kullanabilirsiniz PATH. Ayrıca, argüman sayısını kontrol etme yaklaşımı, rmseçenekler alabileceği gibi , biraz güvenilmezdir .
jw013

1
"$ 1" tırnak içine alınmalıdır, aksi takdirde iletilen tek dosya bir boşluk içeriyorsa bu başarısız olur. @ jw013 - Ayrıca komuttan da kaçabilirsiniz, ör.\rm
jordanm

@jordanm $1Çift tırnak işareti ile alıntı yapma konusunda doğru , kaçan komutta yanlış. Alıntı yapmak yalnızca takma adları bastırır, işlev arama DEĞİLDİR . Bu cevap bir takma ad değil, bir fonksiyon önermektedir.
jw013

1
En azından eski düzenleme işlevseldi - yeni düzenleme, muhtemelen yapılacak doğru şey olmayan kullanıcı komut satırı seçeneklerini atar.
jw013

@ jw013 - İşlevler için değil, yalnızca takma ad aramaları için çalıştığının farkında değildim. Bilgi için teşekkürler.
jordanm
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.