'Rm' veya 'mv' file01.txt, file02.txt… file85.txt gibi bir dizi dosya


23

Bu şekilde adlandırılmış bir sürü dosyam olduğunu varsayalım:

file01.txt file02.txt file03.txt ... file20.txt

ve bu dosyaların bir dizi üzerinde bir komut çalıştırmak istiyorum.

'File05.txt' den 'file09.txt' den 'rm' yapmak isteyip istemediğinizi biliyorum:

rm file0[5-9].txt

ancak file08.txt'den file13.txt'ye kadar bir aralığı nasıl 'rm' yapabilirim? Bu kodu denedim

rm file[08-13].txt

ve çalışmıyor. Bu komutu çalıştırabilirim:

rm file0[89].txt file1[0-3].txt

ama eğer mümkünse bunu 'rm' ye sadece bir tane daha argümanlı argümanla yapıp yapamayacağımı bilmek isterim.


Burada neredeyse özdeş bir soru cevaplandı: stackoverflow.com/questions/25049411/…
arielf

Yanıtlar:


38

Ayraç genişletme kullanmanız gerekir bash:

rm file{08..13}.txt

Bu dosyaları kaldıracaktır file08için file13herhangi bir dosya eksikse, bir hata mesajı gösterecektir.

İhtiyacınıza göre aralığı ayarlayın.


Globbing operatörünün sorunu, içindeki []her karakter / haneye tek bir simge gibi davranması ve bu nedenle yalnızca tek basamak kullanarak aralık bildirimini desteklemesidir.

Kullanmakta ısrar ediyorsanız [], bu oldukça çirkin kalıbı şununla eşleştirmek file08için kullanabilirsiniz file13:

rm file0[8-9].txt file1[0-3].txt

5
kaşlı ayraç için olduğu gibi, aynı zamanda virgül ile yararlıdır mv foo.{txt,md}yacp foo.txt{,.bak}
Kos

2

Ubuntu'nun varsayılanı /bin/sh(ki dash) ya mkshda küme genişlemesi yok ya da küme genişlemesi olması durumunda bazı kabuklar kshyastıklı sıfır kullanamaz:

$ ksh -c 'echo {05..13}'
5 6 7 8 9 10 11 12 13

Bu gibi durumlarda, printfdosya adının sayı kısmını biçimlendirmek için kullanabiliriz ve döngü davranışı için c-like uygulamak için bir süre döngüsü kullanabiliriz ( ne echoile değiştireceğinize rmveya ne ile değiştireceğinize dikkat edin ):

$ i=5; while [ "$i" -le 10 ]; do num=$(printf "%.2d" "$i" ); echo "file$num.txt";i=$(($i+1)); done
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

Ve bu oldukça taşınabilir - ile çalışır dash, ksh, mksh, ayrıca bash. Durumda kshve mksh dash` bashkullanabilirsiniz ):c-style for loop syntax (but not in case ofor

$ ksh -c 'for((i=5;i<11;i++)); do num=$(printf "%.2d" "$i" ); echo "file$num.txt";done'             
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

Bu bashdurumda, printfdeğişkene yazdırmayı desteklediğini ve bu nedenle printf -v num "%.2d" "$i"komut değiştirme yerine kullanabileceğimizi unutmayın.

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.