Kullanımımkdir -p
en modern işletim sistemleri için basit bir yoludur:
mkdir -p foo/bar/zoo/andsoforth
Ancak, mkdir -p
birçok kılavuzda önerilmez. GNU belgelerini make
ve kullanım autoconf
problemlerini 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 cmake
veya autoconf
( M4
) araçların kurulmasını gerektirir (ve olası ön işleme)
install-sh
Komut dosyasını -d
seçeneği ile de kullanabilirsiniz :
install-sh -d foo/bar/zoo/andsoforth
Bu script autoconf
ve automake
proje tarafından kullanılır . Bence en güvenli çözüm olmalı.
O sırada /bin/sh
bağı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 -p
için mkdir
yoktur.
sed
tabanlı çapraz platform versiyonu dirname
koduna 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 1
için test -d "$1" || { mkdir "$1" || return 1; }
çünkü mkdir
yol 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 aaa
ve 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.