belirli bir aralıkta numaralandırılmış dosyaları listele


16

Aşağıdaki gibi numaralandırılmış bir dizindeki dosyaları bir dizi var:

file1.txt
file2.txt
...
file30.txt
...

Şimdi, belirli bir dosya aralığında bir komut çalıştırmak istiyorum, 18 ila 31 diyelim.

Şimdiye kadar aşağıdaki yolları kullandım,

üç argüman

command file1[8-9].txt file2[0-9].txt file3[0-1].txt

Şimdi varsayalım ki diğer her numarayı istiyorum,

döngü

for i in `jot - 18 31 2`; do echo file${i}.txt; done | xargs command

daha güvenilir bir döngü gibi görünüyor (boşluklar çalışıyor)

for i in `jot - 18 31 2`; do echo "\"file${i}.txt\" "; done | xargs command

ama bunu yapmanın daha basit bir yolu olmalı gibi görünüyor. En iyi çözüm dosyaları kümesi komut satırına döndürecek bir bash işlevi oluşturmak olduğunu tahmin ediyorum. Sonra böyle bir şey yapabilirdim,

command `filerange file 18 31`

Bunu verimli bir şekilde yapmanın daha iyi yolları veya önerileri var mı?

Aynı soruyu web'de veya başka bir yerde cevapladığım için özür dilerim superuser.


Sorularımı forxargs kullanarak dosya adlarındaki boşluklara izin veren bir döngü kullanarak bir çözüm içerecek şekilde güncelledim . Eğer bash 4 yoksa çalışıyor gibi görünüyor. Eğer bash 4 varsa, o zaman kesinlikle küme ayracı genişletme kullanın! Seçilen cevaba bakınız. Kar Leoparı bash yükseltmek için
utanmaz

Yanıtlar:


25

Bunu dene:

for file in file{18..31}.txt

"Dizi ifadesi" olarak bilinir ve Bash'in küme ayracı genişletme özelliğinin bir parçasıdır . Bash 3 ve 4'te çalışır.

Artış özelliği Bash 4 için yenidir. Muhtemelen Bash 3.x'iniz vardır.

Bash 4'te şunları yapabilirsiniz:

$ for i in {1..6..2}; do echo $i; done
1
3
5

Ancak Bash 3'te, aynı sonuçları elde etmek için bunu yapmanız gerekir:

$ for ((i=1; i<=6; i+=2)); do echo $i; done

Aynı form bir arttırılır:

$ for ((i=1; i<=6; i++)); do echo $i; done

Sayılardan herhangi biri değişken veya ifade olabilir. Ancak, bir sıra ifadesinde sayıların sabit olması gerekir

Dosyalarınızda bu formu kullanan bir örnek:

for ((i=18; i<=31; i++))
do
    echo "file${i}.txt"
done

Bash 4'teki dizi ifadelerinin bir başka yeni özelliği, baştaki sıfırları dahil etme yeteneğidir. Düzgün sıralanabilen numaralandırılmış dosyalar oluşturmak (ve kullanmak) istiyorsanız bu yararlıdır.

Bash 4'te:

touch file{001..010}.txt

"file010.txt" aracılığıyla "file001.txt" adlı dosyalar oluşturur. İsimleri beklenen sıraya göre sıralanır. Baştaki sıfırlar olmadan, "file10.txt", "file1.txt" den önce sıralanır.

Dosyalarla çalışmak için aynı baştaki sıfır sözdizimini kullanabilirsiniz:

for file in file{001..010}.txt; do echo "$file"; done

Bash 3'te, önde gelen sıfırlara ihtiyacınız varsa, değeri kendiniz doldurmanız gerekir:

for i in {1..10}
do
    printf -v i '%03d' $i 
    echo "file${i}.txt"
done

printfGenişliği 3 yani ifadesi sıfır dolgulu i değerini prepend olacaktır (örneğin "4", "004" olur).

Düzenle:

Dosya adlarında boşluk barındırmak kolaydır:

$ touch "space name "{008..018..3}" more spaces"
$ ls -l sp*
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000008 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000011 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000014 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000017 more spaces
$ for f in "space name "{008..018..3}" more spaces"; do mv "$f" "${f}.txt"; done
$ ls -l sp*
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000008 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000011 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000014 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000017 more spaces.txt

Teşekkür ederim! Bunun tüm hayatım boyunca nerede olduğunu bilmiyorum. Çalışamayacağım tek şey, artışın bash'ın OSX sürümünde işe yaramadığı. yani, {1..10..2}OSX bash'ımda çalışamıyorum.
milkypostman

Peki, Snow Leopard (bazı nedenlerden dolayı) bash 3.1 kullanıyor. Bu bir yazılım sorunudur.
milkypostman

@milkypostman: Artış özelliği ve baştaki sıfırlar {01..10}Bash 4 için yenidir. Muhtemelen Bash 3.x'iniz vardır. Artış özelliğine ihtiyacınız varsa veya aralık sınırları için değişkenler kullanıyorsanız, şu formu kullanın: for ((i=1; i<=10; i+=2}(veya bir i++artırım için). Sayılardan herhangi biri değişken veya ifade olabilir. Daha sonra, fordöngü içindeki değeri kullanmak için : echo "file${i}.txt". In Bash 3, if you need leading zeros, inside the for loop do: printf -vi '% 03d' $ i`, baştaki isıfırlarla değerin önüne geçer , böylece genişlik 3 olur, örneğin ("4", "004" olur).
sonraki duyuruya kadar duraklatıldı.

Dennis, alternatif formu içerecek şekilde çözümünüzü güncellemenin herhangi bir yolu var mı? Bir yorum olarak, muhtemelen almam gereken şeyi şaşırtmak.
milkypostman

@milkypostman: Düzenlediğim yanıtı görün.
sonraki duyuruya kadar duraklatıldı.
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.