Mkdir -p` için bağımsız değişkenler listesi oluşturmak amacıyla parametre genişletmeyi kullanma


10

Böyle bir şey var:

% ls -1dF /tmp/foo/*
/tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/
/tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/
/tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/
.
.
.
/tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/
/tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/
/tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/

barAltındaki her bir alt dizin altında bir dizin oluşturmak istiyorum foo.

Eğer bunu yapmaya çalışırsam

% mkdir -p /tmp/foo/*/bar

... hatayı alıyorum

zsh: no matches found: /tmp/foo/*/bar

(Gez, hatanın nedenini anlayabiliyorum.)

Orijinal sorunu bir for-loop ile çözebileceğimi biliyorum, ancak zshtek bir çağrı için istenen argümanı üretecek bir parametre genişletme biçimini destekleyip desteklemediğini merak ediyorum mkdir -p. IOW, "append eşdeğer bir parametre genişletme /bargenişleterek ürettiği her önek için /tmp/foo/*sonuçlanan",

% mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar

Yanıtlar:


13
setopt histsubstpattern extendedglob
mkdir -p /tmp/foo/*(#q/:s_%_/bar_)

Bu, yalnızca dizinleri eşleştirmek için bir glob niteleyicisi ve her kelimeye bir dize ekleyen bir ubstitution ( yalnızca tarih ikame kalıbı modunda bulunan desen karakterini kullanarak) yapmak için bir değiştirici kullanan uiet bir glob bayrağına sahip genişletilmiş globbing'dir .qs%

man zshexpn

Vay, etkilendim. Hepsini belirttiğiniz man sayfasında bile buldum.
Wildcard

1
mkdir -pBu dizinlerin bazılarının zaten baralt dizinleri varsa hata atmama komutunuzdan biraz farklı bir etkisi olacak Orijinal Poster'in belirtildiğini unutmayın . Küçük nokta ama burada kayda değer. :)
Wildcard

1
Başka bir yol, dizi genişletmeyi kullanmak ${^spec}ve genişleyen barher öğeye eklemek /tmp/foo/*(/): set -- /tmp/foo/*(/)o zamanmkdir -p -- "${^@}/bar"
don_crissti

5

Elbette - bir döngü kullanın

for n in /tmp/foo/*; do mkdir "$n/bar";done

glob'lar henüz oluşturulmamış şeyleri değil , mevcut öğelerin listelerini genişletmek için kullanılır .


Üzgünüm, korkarım sorum açıkça ifade edilmedi. Açıklığa kavuşturacağım.
kjo

2
zshGlob'ları genişletebilir ve tek bir sözdizimiyle metin ekleyebilirse bu yanıt vermez - ancak bence bunu yapmak için tek yol olabilir @kjo.
Wildcard

4

Dizinler bir dizideyse, ${^...}genişletme biçimini kullanabilirsiniz .

a=(/tmp/foo/*/)
mkdir -p ${^a}bar

0

Bunu yapmak için findve öğelerini kullanabilirsiniz xargs:

find /tmp/foo -maxdepth 1 -mindepth 1 -type d | xargs -i echo mkdir -p {}/bar

ki kullanır -maxdepth 1ve -mindepth 1oluşturulmasını önlemek için barhedeflerin alt dizinleri, ve /tmp/foosırasıyla tek başına. type dyalnızca dizinleri dikkate almasını sağlar.

echoGerçek eylemleri gerçekleştirmek için kaldırmanız gerekir, aksi echotakdirde yalnızca yürütülecek satırları yazdırır. Ayrıca $()yürütmek gibi yerine de ekleyebilirsiniz.

Manuel diyor xargs -ikullanımdan kaldırıldı, ama yine de birkaç yıldır iş ... Sen yerini alabilir bu yüzden ben, başka hiçbir eşit kullanışlı bir alternatif bulunursa -iile -I'{}'olmak kadar güncel bununla.


Bu cevap ve sonraki cevap bana iyi geliyor. Biri neden aşağı seçilmeleri gerektiğini açıklayabilir mi? Aşağı oylar iyidir, ancak herhangi bir neden belirtilmezse nasıl öğrenebiliriz?
Joe

OP'nin istediğinden başka hiçbir şey yapmadan çalışan bir alternatiftir. Beni aşar.
loa_in_

Bence cevapların kendileri üzerinde kötü cevapları olması bir çeşit önyargıdır, bu yüzden önyargı benim saygınlığımı olumsuz etkiledi.
loa_in_

Açıklanamayan oyları sevmiyorum, ama böyle bir önyargı görmedim. Genellikle "kötü" yanıtlar (anladığım yanıtlar) aslında kötüdür.
Joe

0

@loa_in_ çoğu vardı, ancak boru findçıkışı sahte bir pas olma eğilimindedir.

find /tmp/foo -maxdepth 1 -mindepth 1 -type d -exec mkdir {}/bar \;

Sadece alternatifi xargsolmayan farklı araçlarla kullanıyorum -exec, bu yüzden yaklaşımımı hepsiyle eşit şekilde çalıştığı için kullanıyorum.
loa_in_
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.