Tüm harfler için özyinelemeli olarak dizinler oluşturma


12

Ben gelen dizinleri etiketlemek için gereken şekilde bir dizin oluşturmak istediğiniz aiçin z. Bu dizinlerin her birinde aa, abvb. Olarak etiketlenmeleri için alt dizinler oluşturmam gerekiyor .

Dolayısıyla, örneğin, dizinin m, benim alt dizinleri olarak etiketlenmiş olacaktır ma, mbkadar mz.


3
ilk mkdir'e ihtiyacınız yoktur çünkü -p alt dizinleri de oluşturur. Ve mutlak yollar kullanıyorsanız cd komutuna ihtiyacınız yoktur. Aksi takdirde güzel, çalışıyor, beyan edilen değişkenler, vs. Michael Homer'in versiyonu daha kısa ve belki de daha iyi bir performansa sahip, ancak böyle basit bir görev için sizinki yeterince iyi olacak.

1
Gün içinde daha fazla termininfo girişi ve bash {a..z} sözdizimi yoktu, bu yüzden /usr/share/terminfo[az] ile listeleyip bu çıktıyı kullanırdım. Linux, bu sayı üzerinde oldukça seyrek, eskiden tüm büyük ve küçük harfler ve rakamlar için girişlerdi.
schemathings

Yanıtlar:


19

Deneyin:

for x in {a..z} ; do mkdir -p $x/${x}{a..z} ; done

Bash genişleyecektir XXX{a..z}dışarı XXXa, XXXbve benzeri. Sahip olduğunuz iç döngüye gerek yok.

Daha sonra:

$ ls
a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z
$ ls m
ma  mc  me  mg  mi  mk  mm  mo  mq  ms  mu  mw  my
mb  md  mf  mh  mj  ml  mn  mp  mr  mt  mv  mx  mz

7

Yani, bash'alfabe genişleme şey ile, bu çalışır:

set {a..z}
for a do printf "./$a/$a%s\n" "$@"
done | xargs mkdir -p

Alfabeyi ilk satırda sadece bir kez yazarsanız, aynı konsept herhangi bir kabuğa taşınabilir olmalıdır. Aşağıdaki gibi yazmak istemiyorsanız ayarlanmış satıra ulaşmanın başka yolları da vardır:

seq -sP32P 97 123|dc
a b c d e f g h i j k l m n o p q r s t u v w x y z 

... örneğin bir ASCII yerel ayarında çalışıyor. Böylece , ihtiyacınız olan argümanların ayrı bir listesini set $(seq -sP32P 97 123|dc)alabileceğiniz herhangi bir komut veya başka bir komut yapabilirsiniz $IFS, ancak, yani, sadece bir şeyi kullanmak bashveya yazmak daha iyidir .

Her neyse, bence bunu sadece mkdirgerektiği kadar çağırdığı için yapardım .

Ve nasıl çalıştığını göstermek için, daha küçük bir kümenin küçük bir hata ayıklama çıktısı:

sh -cx 'for n do printf "./$n/$n%s\n" "$@"; done|cat' -- arg1 arg2 arg3
+ for n in '"$@"'
+ printf './arg1/arg1%s\n' arg1 arg2 arg3
+ cat
+ for n in '"$@"'
+ printf './arg2/arg2%s\n' arg1 arg2 arg3
+ for n in '"$@"'
+ printf './arg3/arg3%s\n' arg1 arg2 arg3
./arg1/arg1arg1
./arg1/arg1arg2
./arg1/arg1arg3
./arg2/arg2arg1
./arg2/arg2arg2
./arg2/arg2arg3
./arg3/arg3arg1
./arg3/arg3arg2
./arg3/arg3arg3

Gördüğünüz gibi, forsadece burada shinvocation ve yukarıdaki ile parametreleri teslim ederek ayarladığım konumsal parametre dizi indeksi başına bir kez döngüler set ${positionals}. Ancak printfher bir yineleme için bağımsız değişken listesinde aynı diziyi alır ve biçim dizesini bağımsız değişkenlerinin her birine uygular, böylece gereksiz özyineleme olmadan özyineleme benzerliğini elde edersiniz.

Ve done|commandirade akışının forboru üzerindeki tüm çıkışlarını aynı şekilde eklemek, done >filehepsini bir dosyaya akıtır - tüm for...doneyapı için çıkış dosyasını yalnızca bir kez açar ve kapatır .


3

Gönderen burada , böyle bir senaryo oluşturarak sona erdi. Ancak, zarif bir çözüm alırsam, bunu bir cevap olarak kabul edeceğim.

for x in {a..z}
do
    mkdir -p /home/ramesh/$x
    cd /home/ramesh/$x
    for y in {a..z}
    do
        mkdir -p /home/ramesh/$x/$x$y
    done
done

+1, iyi soru ve daha iyi cevap :)
Nidal

@Networker, bundan daha iyi bir çözüm olduğundan eminim. İşi bu yanıta benzer şekilde yapacak, ancak çok daha havalı görünecek bazı uzman cevaplarını bekliyorum :)
Ramesh

Kesin olarak, değişken değerlerin ne olacağını bildiğinizde (ve basit dizelerdir) gerekli değildir, ancak değişkenlerinizi alıntılama alışkanlığına girmek iyi bir fikirdir. Sen kullanabilirsiniz /home/ramesh/"$x"/"$x$y", /home/ramesh/"$x/$x$y"ya "/home/ramesh/$x/$x$y"hepsi eşdeğer konum -.
Scott

1

İçinde Perl:

perl -MFile::Path=make_path -e '
    make_path(map { $l=$_; map { "$l/$l$_" } a..z } a..z)
'

File::Patho zamandan beri çekirdek modül Perl 5.001.

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.