dosyalar için mkdir -p


24

mkdir -pbir dizin yaratacak; ayrıca gerektiğinde üst dizinleri oluşturacaktır.

Gerektiğinde bir dosya ve üst dizinler yaratacak dosyalar için benzer bir komut var mı?


Farkında olduğumdan değil .. ama sadece mkdir -p / yolunu / yap / make && dokunuşunu / yolunu / dosyasını / ... yapabileceğini ... bu yeni dizin yapısında boş bir dosya oluşturabilir.

1
@Kansha, bunu dirnameve ile birleştirir basenameve biz sadece tek argümana ihtiyacımız olur; kar! :)

Evet, güzel görüşme.

Yanıtlar:


29

Kaynak dosya verilirse, kurulum bunu yapacak /dev/null. -DArgümanı tüm üst dizinleri oluşturmak için diyor ki:

anthony@Zia:~$ install -D /dev/null /tmp/a/b/c
anthony@Zia:~$ ls -l /tmp/a/b/c 
-rwxr-xr-x 1 anthony anthony 0 Jan 30 10:31 /tmp/a/b/c

Bunun bir hata olup olmadığından emin değil; cihaz dosyalarındaki davranışı man sayfasında belirtilmez. Ayrıca mktempkaynak olarak boş bir dosya ( örneğin yeni yaratılmış) da verebilirsiniz .


7

Hayır, bildiğim kadarıyla yok. Ama her zaman kullanabilir mkdir -pve touchbirbirlerine sonrası:

f="/a/b/c.txt"
mkdir -p -- "${f%/*}" && touch -- "$f"

3

Sık sık bu tür bir durumla karşılaştım, bu yüzden sadece dosyama bir fonksiyon yazdım .bashrc. Bu gibi görünüyor

function create() {
    arg=$1
    num_of_dirs=$(grep -o "/" <<< $arg | wc -l)
    make_dirs=$(echo $arg | cut -d / -f1-$num_of_dirs)
    mkdir -p $make_dirs && touch $arg
}

Dolayısıyla, varolmayan dizinlerin yolunda bir dosya oluşturmak istediğimde, şunu söyleyeceğim:

create what/is/it  # will create dirs 'what' and 'is', with file 'it' inside 'is'

1
Benim adamım! - teşekkür ederim, ben dediğim touchpgibimkdir -p
ekolojik 4

0
dir=$(dirname "$f")
test -d $dir || mkdir -p "$dir"

3
Gerekli testdeğil; mkdir -pDir zaten varsa hiçbir şey yapmaz. Hata bile vermiyor.
derobert,

1
Ve elbette, bu sadece dizini yaratır.
40'da

0

Bunu bir satırda tutarken önerecektim, ancak değişkeni ayrı ayrı ayarlamanız onu değiştirmenize ve komutu tarihe göre kolayca değiştirmenize izin veriyor.

B="./make/this/path" && mkdir -p -- "$B" && touch -- "$B/file.txt"

0

"Sahte yapmak" mümkündür.

İlk olarak, bazı gerekli teori:

Rob Griffiths başlıklı 2007 yılında bir makale yayınlanmıştır Kolayca Yeni Klasörlerin sürü oluşturma o kullanarak tartışılan burada Macworld.com üzerinde xargskullanarak dizinleri oluşturmak için dosyaların listesini okumak için komutu mkdir.

xargsBir referans edebilen placeholder( {}birlikte) -Iiletilen her bir değişken için değeri içeren bayrak xargs. İşte o bayrakla olan ve olmayan arasındaki fark:

$ foo.txt bar.txt | xargs echo
$ => foo.txt bar.txt
$ foo.txt bar.txt | xargs -I {} echo {}
$ => foo.txt
$ => bar.txt

xargsayrıca sh -cbayrakla rasgele kabuk komutları çalıştırabilir :

foo.txt bar.txt | xargs sh -c 'echo arbitrary command!'

Kavramları Birleştirmek:

Biz bu kavramları birleştirebilirsiniz mkdir -pyerine mkdirve de konsept @ldx 'ın cevabı bu üretmeye:

$ cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'

Bu komut, temelde her bir dosya adını satırdan ayrılmış bir dosya listesinde eşler, dosya bölümünü keser, dizinleri oluşturur mkdir -pve sonra touchkendi dizininde bir dosya adı oluşturur .

İşte yukarıdaki komutta olanların bir dökümü:

Mesela benim files.txtgörünüşüm şöyle diyor:

deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
  • cat files.txt üretir deeply/nested/foo/bar.js deeply/nested/baz/fiz.txt
  • deeply/nested/foo/bar.js deeply/nested/baz/fiz.txt borulu xargs
  • kullandığımız için -I {}, xargsher bir argümanı kendi emrine çeviririz, bu yüzden şimdi elimizde:
    • deeply/nested/foo/bar.txt
    • deeply/nested/baz/fiz.txt
  • daha sonra &&sırayla çalışan 3 komutu gruplamak için birleştirici kullanan bir kabuk komutu çalıştırıyoruz - ilk komut, daha önce kaydettiğimiz yer tutucuyu kullanarak dosyayı bir ortam değişkeninde (bir sonraki dosya geçişinde yeniden kullanılan) depolar, bu yüzden şimdi var:
    • f=deeply/nested/foo/bar.txt
    • f=deeply/nested/baz/fiz.txt
  • Şimdi geçebileceğimiz bir değişkenimiz var mkdir -p, ancak dosya adını kesmemiz gerekiyor. Kullanması yeterince basit '${f%/*}':
    • mkdir -p deeply/nested/foo/
    • mkdir -p deeply/nested/baz/
  • ve sonra biz sadece fdeğişkenleri bütünüyle yeniden referans alırız touch:
    • touch deeply/nested/foo/bar.txt
    • touch deeply/nested/baz/fiz.txt

2
Temelde cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"', UUOC olan şey için tüm bu açıklamaya sahipsiniz, daha sonra bir while readdöngü daha mantıklı olduğunda, kabuğa geri dönen kabuklara geri dönersiniz
Steven Penny

1
İtiraf edeceğim * en çok açıklanan * nix komutları ben değilim - UUOC'nin ne olduğunu bile bilmiyorum - ama bunun nasıl korkunç bir cevap olduğunu göremiyorum. Araştırılmış, test edilmiş ve asıl sorunuza yönelik çalışan bir çözümdür. Yapıcıdır (kaba yorumunuzdan farklı olarak). Lütfen, burada yapmamam gereken sorumsuz bir şey yaptığımı düşünüyorsanız, o zaman daha fazla ayrıntılandırın - nedenini açıklayın . Maddesi olmayan, tartışılan tartışmalara pek aldırmıyorum.
ustura

1
Son yorumum bunu mükemmel bir şekilde açıklıyor. Tüm cevabınız olarak daha iyi yazılmış olabilir while read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt. UUOC için 10 saniyelik bir internet araması yapamayacağınızı da söylüyor
Steven Penny
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.