Tüm alt dizinlerde nasıl bir dizin oluşturabilirim?


34

Diyelim ki böyle bir dizin yapısına sahibim:

$ [~ / pratik] ls
a / b / c / d /

Şimdi tmp1tüm alt dizinlerinde bir dizin oluşturmak istiyorum practiceve bunu yapıyorum:

$ [~ / practice] mkdir * / tmp1
mkdir: dizin oluşturulamıyor `* / tmp1 ': Böyle bir dosya veya dizin yok

Sonra -panahtarı denedim ve *alt dizinde bir dizine son veriyorum.tmp1

$ [~ / practice] mkdir -p * / tmp1

$ [~ / pratik] ls
* / a / b / c / d /

-pAnahtarın kullanılmasının çoklu varolmayan dizinler oluşturmak olduğunu biliyorum . Sadece yardımcı olabileceğini düşündüm.

tmp1Tüm alt dizinlerde bir kerede nasıl oluşturabilirim ?

Bu yapılabilir, nasıl bunu oluşturmak için uzatmak yok \tmp1, \tmp2, \tmp3içinde \a, \bve \cbir kerede?

Düzenleme: Ben dizinleri basit ve sırayla, böyle olmak zorunda olmadığını belirterek cevapsız a, b, cvs. ve oluşturulacak dizin gibi ille değildir tmp1, tmp2.

$ [~ / pratik] ls
köpek / kedi / sıçan /

Onlarda, şöyle bir şey olmasını isterdim

$ [~ / pratik] ls *
köpek:
kırmızı mavi/

kedi:
kırmızı mavi/

sıçan:
kırmızı mavi/

1
Christopher'ın cevabı göz önüne alındığında , "create \ tmp1, \ tmp2, \ tmp3 in \ a, \ b ve \ c" toplam 3 veya 9 alt dizine neden olup olmayacağını netleştirmelisiniz.
Manatwork

@ manatwork: Bu iyi bir nokta. 9 alt dizin oluşturmalı.
Animesh,

Bu, sudo find dizinindeki uzay sorununu çözmek için benim yardımım. / -Depth -type d -exec echo '"{} / RCS"' \;

Yanıtlar:


44

İle Neználkovo :

for dir in */; do mkdir -- "$dir/tmp1"; done

NOT

  • Sadece kirleri (direklere bağlı olanlar da dahil) */küre gibi kullanmanın küçük kesmesiyle tedavi ediyorum
  • Aynı anda birden fazla alt dizin oluşturmak istiyorsanız:

    for dir in */; do mkdir -- "$dir"/{tmp1,foo,bar,qux}; done


Yapabileceğim for i in */; do mkdir "$i/itemone" "$i/itemtwo"; donebirden değil-içinde-sipariş dizin adları için?
Animesh,

Bunu test ettim ve çok mümkün. Teşekkürler.
Animesh,

Düzenlenen yayınımı gör
Gilles Quenot,

1
Ayraç genişletme, alıntı dizesinde gerçekleştirilmez.
Manatwork

Evet, teşekkürler, Stephane Chazelas tarafından buna göre düzenlenmiş gönderi ...
Gilles Quenot

10

[...] bir kerede \ a, \ b ve \ c \ tmp1, \ tmp2, \ tmp3 oluşturmak için nasıl genişletebilirim?

 mkdir {a,b,c}/tmp{1,2,3}

10

GNU veya BSD ile * bulmak:

find -mindepth 1 -maxdepth 1 -type d -exec mkdir {}/newdir \;

veya parametre genişletmeyi kullanarak:

dirs=(*/)
mkdir -- "${dirs[@]/%/newdir}"

* OS X'i içerir


2
Standart bulma sözdizimi ile:find . -name . -o -prune -type d -exec sh -c 'exec mkdir "$1/newdir"' sh {} \;
Stéphane Chazelas

1
Ayrıca iki çözüm arasındaki farklara dikkat edin: birincisi gizli dizinleri içerir, ikincisi geçerli dizindeki herhangi bir sembolik bağlantı ile bağlanmış dizinlere bir newdir.
Stéphane Chazelas,

6

Bahsettiğinizden beri konu dışı bash, ancak kayıt için, zsh ile yapardınız:

dirs=(*(/))
mkdir -- $^dirs/tmp1

$^varaçar bağ benzeri yelpazesinin genişletilmesi için genişleme. Bu anımsatan var rcbireyin ^operatörü ve rc(veya türevi es, bunu yazmak istiyorum):

dirs=(*/)
mkdir -- $dirs^tmp1

Bununla birlikte (ve burada da verilen bash çözümleri için de geçerlidir), rc çözümünde dirsayrıca dizinlere sembolik bağlantılar içereceğini de unutmayın. Zsh çözümde, değişim *(/)için *(-/)isterseniz dizinlere sembolik dahil etmek.


Symlinks hakkında senin nokta için +1! Bu davranış istenebilir, ancak mkdir'in yinelenen bir dizin oluşturma konusundaki şikayeti -pbayrakla gizlenebilir.
kojiro

4

Taşınabilir olarak, üst dizinler üzerinde döngü:

for d in */; do mkdir "$d/red" "$d/blue"; done

--Sonra mkdiradıyla başlayan dizinleriniz varsa ekleyin -.

Zsh'de, e glob niteleyici ile tek bir komutla yapabilirsiniz :

mkdir *(/e\''REPLY=($REPLY/{red,blue})'\')

ancak bunu iki komut olarak yazmak daha hızlıdır:

d=(*(/)); mkdir $^d/{red,blue}

1
Referans olması gereken bir sitede, " mkdir -- whateverve muhtemelen komuta seçenek olarak alınacak herhangi bir şeyi genişletmeyi düşünürseniz atlayın " derim . Burada atlamanın bir anlamı yok. OP'nin durumunda bir sorun olmayabilir, ancak genel durumda birdir. Burada doğru ve güvenli sözdizimini öğretme görevimiz olduğunu düşünüyorum. --mkdir--
Stéphane Chazelas

@StephaneChazelas Komut dosyası bağlamında, --yeni satırlar desteklenmiyorsa her zaman gerekli tüm teklifleri ve büyük yağ uyarılarını koyarım . Komut satırı bağlamında, ilk önce pratikte çalışan hızlı sürümü ve kurşun geçirmez sürümü tamamlayıcı olarak göstermeyi tercih ederim.
Gilles 'SO- kötülük'


1

Dizin dışı dosyaları engelleyen sputnick'in cevabındaki değişiklik:

for x in *; do if [ -d "$x" ]; then mkdir "$x/tmp1"; fi; done

Ben sadece küflüyüm, hepsi bu kadar büyü ...
Gilles Quenot

cool, anladım;)
goldilocks

2
Olmamalı mıydı if [ -d "$x" ];…?
kojiro

Evet. Neredeyse hiçbir zaman dosya isimlerinde boşluk bırakmadım ve bu şeyleri unutmaya meyilliyim ...
goldilocks

1

Eğer sürüm kontrolü yapmak istiyorsanız (RCS check-in kilitliyken: ci -l, ir: ilk sürüm için kısa bir yorumla) / etc / * config dosyalarınız için eski Unix Masters'tan (FreeBSD 10.1'de test edilmiştir) iyi bir örnek. ~ / .his / etc üzerinde

sudo rsync -av /etc/ ~/.his
sudo find -d ~/.his/etc -type d -exec echo '{}/RCS' \; | xargs sudo mkdir -p
sudo find -d ~/.his/etc \! -name "RCS" | xargs sudo ci -l -mir -t-ir

Bunun nasıl bir cevap verdiğini göremiyorum OP
Archemar

1

Olmalı \! "RCS" olarak adlandırılır ve ilk check-in sırasında en iyi şekilde çalışır.

sudo bulmak ~ / .his / etc \! -Ad "RCS" -ls

sudo find -d ~ / .his / etc \! -Ad "RCS" | xargs sudo ci -l -mir -T-ir

Bu sonuncusu, dosya adındaki tüm RCS içeriğini filtreleyen kısımda cjeck için çok iyi çalışıyor:

sudo bulmak -d ~ / .his / etc -type f | grep -v RCS | xargs sudo ci -l -mir -T-ir


1

bu bana çok yardımcı oldu. Birden fazla klasörde bir dizi alt dizin oluşturma ihtiyacım vardı ve bunun gibi bir şey:

!/bin/sh

cd /dest/cont

for dir in */*/; do
    mkdir -p -- $dir/{FB,Video,Audio,proj};
done

Beyaz bir boşluk ile karşılaşıldığında dışında harika çalıştı. */*/Argümanlar bölümünde boşlukları görmezden gelmenin bir yolu var mı?

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.