özyinelemeli mkdir


305

Üzerinde durduğum, satırları boyunca bir şeyler yapmayı mümkün kılan bir linux komutu var mı: (sözde)

$ mkdir -R foo/bar/zoo/andsoforth

Yoksa bir kerede dizinleri yapmaktan başka alternatif yok mu?



1
komik, o sayfaya bakıyordum ama tamamen "göz ardı edildi" çünkü onları çocuk olarak düşünüyordum (soldan sağa).

18
Protip: Bazı mermilerde bile yapabilirsiniz mkdir -p foo/{bar,baz}/zoo/andsoforth. Çok kullanışlı!
Aaron Copley

1
Şahsen, man sayfasında "veli" yi de göz ardı ettim, çünkü bayrak "özyinelemeli" için "-r" olmalı - ya da en azından, mkdir6 toplamda belgelenmiş bayraklar. Kahretsin, komut varsayılan olarak yinelemeli olarak dizinler oluşturmalı ve bunu istemiyorsanız açıkça belirtmeniz gerekir.
jbowman

Yanıtlar:


511
$ mkdir -p foo/bar/zoo/andsoforth

92
FYI the -p "veliler" anlamına gelir
carl crott

14
Bunun yerine -r yapabilirlerdi, herhangi bir komutta olduğu gibi, her linux komutu için belirli parametreleri hatırlamak imkansızdır
Vedmant

2
Ancak mkdir -pçapraz platform değil, her kabukta işe yaramaz
Роман Коптев

9
@ РоманКоптев, mkdir -pbir POSIX'deki belirtilen tam taşınabilir olması en yakın şeydir. Bir kabuk betiğinde daha iyi ne bekliyorsunuz?
Wildcard

5
@StephanBijzitter Evet, bu unix.se, unixandwindows.se değil. :)
EEAA

16

Kullanımımkdir -p en modern işletim sistemleri için basit bir yoludur:

mkdir -p foo/bar/zoo/andsoforth

Ancak, mkdir -pbirçok kılavuzda önerilmez. GNU belgelerini makeve kullanım autoconfproblemlerini okuyun mkdir -p:

Çapraz platform kurulum ve konfigürasyon sistemleri kendi kasa için alternatiflermkdir -p .

Kabuk komut satırında kullanılacak CMake:

 cmake -E make_directory foo/bar/zoo/andsoforth

Ön işleme ile komut dosyasında kullanmak için Autoconf:

AS_MKDIR_P(foo/bar/zoo/andsoforth)

veya:

AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)

Ancak bu çözümler cmakeveya autoconf( M4) araçların kurulmasını gerektirir (ve olası ön işleme)

install-shKomut dosyasını -dseçeneği ile de kullanabilirsiniz :

install-sh -d foo/bar/zoo/andsoforth

Bu script autoconfve automakeproje tarafından kullanılır . Bence en güvenli çözüm olmalı.

O sırada /bin/shbağımlı olmadan standart için bir çapraz platform çözümü arıyordum , ancak bir tane bulamadım. Bu nedenle , ideal olmayabilecek bir sonraki senaryoyu yazdım , ancak çoğu çapraz platform gereksinimlerine uygun olduğunu düşünüyorum :

#! /bin/sh

cdirname() # cross platform alternative for 'dirname'
{
  # $1 - path
  test $# -eq 1 || { echo "Procedure 'cdirname' must have only one parameter. Scripting error."; exit 1; }
  echo "$1" | sed -n -e '1p' | sed  -e 's#//*#/#g' -e 's#\(.\)/$#\1#' -e 's#^[^/]*$#.#' -e 's#\(.\)/[^/]*$#\1#' -
}

mkd() # cross platform alternative for 'mkdir -p'
{
  # $1 - directory to create
  test $# -eq 1 || { echo "Function 'mkd' can create only one directory (with it's parent directories)."; exit 1; }
  test -d "$1"  && return 0
  test -d "$(cdirname "$1")" || { mkd "$(cdirname "$1")" || return 1; }
  test -d "$1" || { mkdir "$1" || return 1; }
  return 0
}

Bu komut seçeneği eski sistemler için kullanılabilecek -piçin mkdiryoktur.

sedtabanlı çapraz platform versiyonu dirnamekoduna eklenmiştir. Şuna benzer bir yolla çalışır dirname(yolu doğru /, yalnızca taban adı olan yollar, izleri /olan yollar, izleri olan ve olmayan yollar \n). Yolda yeni satırlar varsa veya geçerli yerel ayar için geçersiz karakterler varsa, bu işlev doğru çalışmayabilir. Ayrıca, /( //, ///) ' nin herhangi bir kombinasyonunu tek/

Değiştirilen satır mkdir "$1" || return 1için test -d "$1" || { mkdir "$1" || return 1; }çünkü mkdiryol var ve bu onay gibi yapılar içeren yollar için gerekiyorsa hatasıyla sonlanır aaa\.(Eğer aaaönceki sürümünü oluşturur yok aaave yeniden oluşturmaya çalışır).

Mkd'nin bu sürümü, yol zaten mevcutsa bir hata üretmez (ancak paralel yürütmede böyle bir hata üretme olanağına sahiptir) ve komut satırında birkaç dizin alamıyor.


4
"mkdir -p" posix ile tanımlanmıştır. Hangi unix veya unix benzeri değişkenler desteklemiyor? (ve yerleşik bir kabuk olmamalıdır, ancak olmamasının bir nedeni olmamasına rağmen.) pubs.opengroup.org/onlinepubs/9699919799/utilities/mkdir.html
Tim B

5
Bu sayfadaki bilgilerin bir kısmı sadece 15 yaşında. Bazıları eski.
Thomas Dickey

7
Desteklemeyen sistemler , seçeneklerin sonunu işaretlemek için mkdir -pbir olanak printfya da desteğe sahip olmak için çok eski olurdu (ve en azından birkaç on yıllık konuşuyoruz) --.
Stéphane Chazelas

2
Sizin cdirnameiçin yanlış cevap verecekti foo/bar//, ya da dizin adları geçerli yerelde yeni satır karakterleri veya geçersiz karakterler içeren.
Stéphane Chazelas

2
printfPOSIX sistemlerinde güvenlidir. POSIX sistemleri desteği mkdir -p. mkdir -pPOSIX tarafından on yıllardır belirtilmiştir. --80'li yılların ortalarında SysIII ile başlayan AT&T sistemlerinde yaygınlaşmaya başladı. printfilk önce kshinanıyorum ve POSIX tarafından daha sonra belirtildiğine inandığım bir yerleşik olarak göründü mkdir -p. Bazı POSIX mermileri (pdksh veya yash bazlı) hala printfyerleşik değil .
Stéphane Chazelas

0

Opsiyon -pkomuta mkdiryapar p Arent dizinleri (hiçbir hata mevcut ise) gerektiği gibi:

mkdir -p foo/bar/zoo/andsoforth

Başka bir yol, örneğin kullanmaktır &&(belirtilen klasör varsa hata):

mkdir foo && mkdir foo/bar && mkdir foo/bar/zoo && mkdir foo/bar/zoo/andsoforth

Zincirleme operatörü &&, komutları bir araya getirmek için kullanılır; öyle ki, bir sonraki komut yalnızca önceki komut hatasız olarak çıkarsa çalıştırılır.

Tabii ki, ilk yol daha iyidir.


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.