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.