{1,2,3} ve {1..3} arasındaki fark


17

Diziler {1,2,3}ve arasında bir fark var mı {1..3}?

Örneğin, bazı dosyalarım varsa

file.1
file.2
file.3

ve catbirlikte kullanmak istiyorum güvenli cat file.{1..3} > filemidir?

Bildiğim bu cat file.*>filesorunlara neden olabilir çünkü kabuk dosyaları bazen rastgele bir şekilde genişletebilir (bence bu inodelara bağlıdır, öyle mi?)


1
kullanımcat file.[123] >file
mikeserv

3
' file.*Nin genişleme sırası inotlara bağlı değildir. Onları her zaman sözlükbilimsel olarak sıralar, bu da konum ayarınıza bağlı olabilir.
Barmar

1
"inode'lara bağlıdır" daha iyi araştırılmış suç-zihin-eqsue "bilgisayar" sahnelerinden bir aşama gibi geliyor.
Alec Teal

1
@mikeserv, anladım inanıyorum - bu bir kabuk glob, bu yüzden sadece gerçekte var olan dosyalara genişliyor, değil mi? Vs. file.{1..3}bu da, var olsun ya da olmasın üçüne de genişler.
Joker karakter

1
@Wildcard - doğru, en az biri olduğu sürece, yani. Eğer değilse hiç genişlemez ve cathatalar file.[123] not foundya da çok yararlı bir şey.
mikeserv

Yanıtlar:


18

{1..3}ve {1,2,3}aynı sonucu, ancak farklı bir yolla üretir.

Genel olarak, {n1..n2}(ki birinci geldi zsh, bashve kshdaha sonra kopyalanan) nerede n1ve n2tamsayılar arasındaki tüm sayılar üretmek edilir n1ve n2. İken {x,y,z}üretmek üç karakter x, yve z.

Sizin durumunuzda, cat file.{1..3} > file

Şimdi, durumunda tüm dosya adını üreten kabuk globbing'icat file.*>file kullandınız ve sonuç geçerli yerel ayardaki harmanlama sırasına göre sıralanacaktır.file.

Hala güvendesiniz, ancak 10'dan fazla dosyanız olduğunda artık değil. {1..10}verecek 1 2 3 4 5 6 7 8 9 10. Globbing yaparken, alacaksınız1 10 2 3 4 5 6 7 8 9


8

Fark, birinin bir liste ve diğerinin bir dizi olmasıdır. {1,2,3}üç spesifik elemanlarına genişler 1, 2ve 3. {1..3}bir ile üç arasındaki sayılar listesine genişler. Bu özel durumda, bunlar aynıdır ve ikisinden birini kullanabilirsiniz. file.*geçerli dizindeki adı ile başlayan tüm dosya ve dizinlere genişler file.. Eğer sadece file.1, file.2ve file.3çok diğer ikisine denk olduğunu o zaman.

Neden olduğu sorunlarına gelince, nedenini görmüyorum. Düşünüyor olabilirsiniz

$ cat file.* > file.txt
cat: file.txt: input file is output file

Ancak bu tamamen farklı bir konudur. Aklıma gelen tek sorun, kabuğunuzun dosyaları doğru sırada listelememiş olabileceğidir. Örneğin:

$ touch file1 file11 file2
$ echo file*
file1 file11 file2

Bunu çözmek için kullanabilirsiniz zshyerine bash(bkz burada detaylar için):

% echo f*(n)
file1 file2 file11

Genel olarak, üç yaklaşım aynı değildir. Bu ne yapmak istediğinize bağlıdır. Üçünün aynı çıktıyı döndürdüğü durumlarda, evet, bunlardan herhangi birini kullanabilirsiniz. Fark yaratmıyor. Tüm bu açılımlar kabuk tarafından yapılır ve hangi komutu kullanırsa kullanılsın önce gerçekleşir .


*Doğru siparişe bağlı olarak 10 veya daha fazla dosyam olsaydı sorun olmaz mı?
syss

1
@syss no. ARG_MAXDosyalardan daha fazlasına sahip olsaydınız bir sorun olurdu ama bu yol 10'dan fazla olacak.
terdon

1
@terdon Argüman dizisini taşıp taşmayacaklarını değil, sayısal sırayla görünüp görünmeyeceklerini (yani "1, 10, 2" değil) soruyordu.
Random832

3
@terdon Bence syss çıktı cat *iyi tanımlanmamış olduğunu doğru. Çıktı kabuğa ve çevreye bağlıdır. Sebastian'ın yorumuna bakın .
Marco

Ekleme .txtsorunu çözmeyecek file.*mi?
Ismael Miguel

6

Aynılar, ancak mevcutsa yüklediğiniz bash sürümüne bağlıdır.

Gönderen bu sayfada:

{xxx,yyy,zzz,...} probably in all bash versions

{a..z} introduced in bash 3

{<START>..<END>..<INCR>} new in bash 4
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.