Listeden dosyaları etkileşimli olarak silme


13

Bir dosya listesini kaldırmak ve onaylamanız isteniyor. Liste list.txtdosyada. Aşağıdaki komut neden düzgün çalışmıyor?

while read i; do rm -i $i; done < list.txt

Önceki komut beni beklemiyor ama neyse ki hiçbir dosya silinmiyor.

Bash kullanıyorum.

Yanıtlar:


20

rm -icevabını whiledöngüden aldığı standart girişten okur . Yani bir metin satırı list.txt"gerçekten kaldırılsın mı?" soru. Düzeltmek için iki giriş kaynağını ayırmanız gerekir. En kolay yol, readgirdisini ayrı bir dosya tanımlayıcıdan almaktır:

while IFS= read <&3 -r i; do
  rm -i -- "$i"     # Quote the file name, not just to be safe,
                    # but because it's the right syntax.
done 3< list.txt

Artık while döngüsü için standart girişi (fd 0) yönlendirmiyorsunuz, bu nedenle rmterminalden istediğiniz şekilde okunacaktır.

Alternatif olarak şunları yapabilirsiniz:

IFS=$'\n' # set field separator to newline
set -f    # disable globbing upon command substitution
rm -i -- $(cat list.txt)

Veya GNU xargs ile:

xargs -rd '\n' --arg-file=list.txt rm -i --

1
Listede bir ydosya olsaydı, önceki dosya silinir miydi?
Francesco Turco

5
Sadece değil y, ile başlayan herhangi bir isim y. Görünüşe göre, rmaldığı yanıtın ilk karakterine bakar: 'y' evet, başka bir şey hayır.
chepner

2

Her dosyaya evet veya hayır yanıtından biraz meraklı bir şey iselectiçin, etkileşimli ncurses tabanlı seçim için kullanabilirsiniz . Örneğin

iselect -a -m < list.txt | xargs -d '\n' -r echo rm 

veya geçerli dizindeki dosyaların seçilmesine izin vermek için:

find . -maxdepth 1 -type f | iselect -a -m | xargs -d '\n' -r echo rm

Bu, SPACE tuşuna basılarak dosyaların isteğe bağlı olarak seçilebileceği ve seçimlerinin kaldırılabileceği tam ekran (tam terminal) ncurses tabanlı bir liste görüntüler. seçimlerinizi kabul etmek için ENTER tuşuna basın (seçilen girişler stdout'ta yazdırılır) veya qçıkmak için (stdout'a yazdırılan hiçbir şey). hyardım için basın .

Not echo rm- test için böyle yazdım. sadece rmne yaptığını anladığınızdan emin olduğunuzda değiştirin .

Ayrıca xargsburada \ngiriş ayırıcı olarak kullanıldığını unutmayın . Dosya adlarından herhangi birinde satır besleme karakterleri varsa bu çalışmaz. Bu nedenle, iselectdüzgün çalışmaz - satır başına bir öğe bekler - u iselectmaalesef, boş sonlandırılmış giriş veya çıkış için bir seçenek yoktur.

iselectdebian, ubuntu ve diğer dağıtımlar için de paketlenmiştir. ana sayfa http://www.ossp.org/pkg/tool/iselect/ adresinde

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.