Menggunakanmkdir -p adalah cara sederhana untuk sebagian besar OS modern:
mkdir -p foo/bar/zoo/andsoforth
Namun, mkdir -ptidak direkomendasikan dalam banyak manual. Baca dokumentasi untuk GNU makedan autoconftentang masalah dalam menggunakan mkdir -p:
Instalasi lintas platform dan sistem konfigurasi memiliki alternatifmkdir -p amannya sendiri .
CMake untuk digunakan di baris perintah shell:
cmake -E make_directory foo/bar/zoo/andsoforth
Autoconf untuk digunakan dalam skrip dengan preprocessing:
AS_MKDIR_P(foo/bar/zoo/andsoforth)
atau:
AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)
Tetapi solusi ini membutuhkan cmakeatau autoconf( M4) alat untuk diinstal (dan kemungkinan preprocessing)
Anda juga dapat menggunakan install-shskrip dengan -dopsi:
install-sh -d foo/bar/zoo/andsoforth
Script ini digunakan oleh autoconfdan automakeproyek. Saya pikir itu harus menjadi solusi teraman.
Saat itu saya sedang mencari solusi lintas platform untuk standar /bin/shtanpa ketergantungan, tetapi belum menemukannya. Oleh karena itu saya menulis skrip berikutnya yang mungkin tidak ideal, tetapi saya pikir itu sesuai dengan sebagian besar persyaratan lintas platform :
#! /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
}
Skrip ini dapat digunakan untuk sistem lama, di mana opsi -puntuk mkdirtidak ada.
sedVersi lintas platform berbasis dirnameditambahkan ke kode. Ia bekerja dengan cara yang mirip dengan dirname(benar dengan path /, path dengan nama dasar saja, path dengan trailing /, path dengan dan tanpa trailing \ns). Fungsi ini tidak dapat berfungsi dengan benar jika jalur memiliki baris baru atau beberapa karakter yang tidak valid untuk lokal saat ini. Itu juga menggantikan kombinasi /( //, ///) dengan tunggal/
Baris yang diubah mkdir "$1" || return 1menjadi test -d "$1" || { mkdir "$1" || return 1; }karena mkdirberakhir dengan kesalahan jika jalur ada dan pemeriksaan ini diperlukan untuk jalur yang berisi konstruksi seperti aaa\.(Jika aaatidak ada versi sebelumnya membuat aaadan kemudian mencoba untuk membuatnya lagi).
Versi mkd ini tidak menghasilkan kesalahan jika path sudah ada (tetapi masih memiliki kemungkinan untuk menghasilkan kesalahan seperti itu dalam eksekusi paralel) dan tidak bisa mendapatkan beberapa direktori di command line.