Sử dụngmkdir -p
là một cách đơn giản cho hầu hết các hệ điều hành hiện đại:
mkdir -p foo/bar/zoo/andsoforth
Tuy nhiên, mkdir -p
không được khuyến khích trong nhiều hướng dẫn. Đọc tài liệu về GNU make
và autoconf
về các vấn đề khi sử dụng mkdir -p
:
Các hệ thống cài đặt và cấu hình đa nền tảng có các lựa chọn thay thếmkdir -p
an toàn cho riêng họ .
CMake để sử dụng trong dòng lệnh shell:
cmake -E make_directory foo/bar/zoo/andsoforth
Autoconf để sử dụng trong tập lệnh với tiền xử lý:
AS_MKDIR_P(foo/bar/zoo/andsoforth)
hoặc là:
AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)
Nhưng các giải pháp này yêu cầu cmake
hoặc autoconf
( M4
) các công cụ được cài đặt (và có thể tiền xử lý)
Bạn cũng có thể sử dụng install-sh
tập lệnh với -d
tùy chọn:
install-sh -d foo/bar/zoo/andsoforth
Kịch bản này được sử dụng bởi autoconf
và automake
dự án. Tôi nghĩ rằng nó phải là giải pháp an toàn nhất.
Lúc đó tôi đang tìm kiếm một giải pháp đa nền tảng cho tiêu chuẩn /bin/sh
mà không phụ thuộc, nhưng vẫn chưa tìm thấy. Do đó, tôi đã viết kịch bản tiếp theo có thể không lý tưởng, nhưng tôi nghĩ nó phù hợp với hầu hết các yêu cầu đa nền tảng :
#! /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
}
Kịch bản này có thể được sử dụng cho các hệ thống cũ, nơi lựa chọn -p
cho mkdir
là vắng mặt.
sed
phiên bản đa nền tảng dựa trên dirname
đã được thêm vào mã. Nó hoạt động với một cách tương tự dirname
(chính xác với đường dẫn /
, đường dẫn chỉ có tên cơ sở, đường dẫn có dấu /
, đường dẫn có và không có dấu \n
). Hàm này không thể hoạt động chính xác nếu đường dẫn có dòng mới hoặc một số ký tự không hợp lệ cho miền địa phương hiện tại. Nó cũng thay thế bất kỳ sự kết hợp nào của /
( //
, ///
) bằng một/
Thay đổi dòng mkdir "$1" || return 1
thành test -d "$1" || { mkdir "$1" || return 1; }
vì mkdir
chấm dứt lỗi nếu đường dẫn tồn tại và kiểm tra này là cần thiết cho các đường dẫn có chứa các cấu trúc như aaa\.
(Nếu aaa
không tồn tại phiên bản trước tạo aaa
và sau đó cố gắng tạo lại nó).
Phiên bản mkd này không tạo ra lỗi nếu đường dẫn đã tồn tại (nhưng nó vẫn có khả năng tạo ra lỗi như vậy khi thực hiện song song) và không thể nhận được một số thư mục trong dòng lệnh.