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.