Menggunakanmkdir -p
adalah cara sederhana untuk sebagian besar OS modern:
mkdir -p foo/bar/zoo/andsoforth
Namun, mkdir -p
tidak direkomendasikan dalam banyak manual. Baca dokumentasi untuk GNU make
dan autoconf
tentang 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 cmake
atau autoconf
( M4
) alat untuk diinstal (dan kemungkinan preprocessing)
Anda juga dapat menggunakan install-sh
skrip dengan -d
opsi:
install-sh -d foo/bar/zoo/andsoforth
Script ini digunakan oleh autoconf
dan automake
proyek. Saya pikir itu harus menjadi solusi teraman.
Saat itu saya sedang mencari solusi lintas platform untuk standar /bin/sh
tanpa 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 -p
untuk mkdir
tidak ada.
sed
Versi lintas platform berbasis dirname
ditambahkan 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 \n
s). 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 1
menjadi test -d "$1" || { mkdir "$1" || return 1; }
karena mkdir
berakhir dengan kesalahan jika jalur ada dan pemeriksaan ini diperlukan untuk jalur yang berisi konstruksi seperti aaa\.
(Jika aaa
tidak ada versi sebelumnya membuat aaa
dan 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.