2013-09-04 38 views
53

Trong kịch bản bash của tôi, tôi làm:Chỉ mkdir nếu nó không tồn tại

mkdir product; 

Khi tôi chạy kịch bản nhiều hơn một lần tôi nhận được:

mkdir: product: File exists 

Trong giao diện điều khiển.

Vì vậy, tôi đang tìm cách chỉ chạy mkdir nếu thư mục không tồn tại. Điều này có thể không?

+1

sản phẩm mkdir 2>/dev/null – dcaswell

Trả lời

121

Thực hiện kiểm tra

[[ -d dir ]] || mkdir dir 

Hoặc sử dụng -p tùy chọn:

mkdir -p dir 
+2

Tôi không thể tìm thấy nguồn trên máy bay, nhưng đối với Makefiles 'mkdir -p' không được khuyến khích b/c có thể có các điều kiện chủng tộc trong việc thực hiện đồng thời. Vì vậy, tùy thuộc vào những gì kịch bản của bạn làm và trong đó môi trường nó sống tùy chọn đầu tiên được đưa ra là câu trả lời này nên được ưa thích. Ngoài ra, bạn chỉ có thể 'mkdir sản phẩm 2>/dev/null' và không quan tâm. – user1129682

+1

@ user1129682: Tùy chọn đầu tiên cũng có điều kiện đua tiềm năng; thư mục có thể được tạo bởi một số tiến trình khác giữa phép thử '-d' và' mkdir'. Tôi nghi ngờ 'mkdir -p' làm cho cửa sổ thời gian này cho điều kiện chủng tộc này hơi ngắn hơn. –

+0

Bên cạnh điều kiện cuộc đua trong thử nghiệm không cần thiết, cũng có khả năng 'dir' tồn tại ** nhưng không phải là thư mục **, nhưng tệp hoặc mục nhập thiết bị hoặc ổ cắm unix-domain hoặc ống được đặt tên hoặc _whatever_ ... – wildplasser

3

mkdir -p

-p, --parents không có lỗi nếu có, tạo thư mục mẹ như cần

8

Sử dụng tùy chọn -p của mkdir, nhưng lưu ý rằng nó cũng có hiệu ứng khác.

-p  Create intermediate directories as required. If this option is not specified, the full path prefix of each oper- 
     and must already exist. On the other hand, with this option specified, no error will be reported if a directory 
     given as an operand already exists. Intermediate directories are created with permission bits of rwxrwxrwx 
     (0777) as modified by the current umask, plus write and search permission for the owner. 
2

Hãy thử sử dụng này: -

mkdir -p dir; 

LƯU Ý: - này cũng sẽ tạo ra bất kỳ thư mục trung gian mà không tồn tại; ví dụ,

Check-out mkdir -p

hoặc thử này: -

if [[ ! -e $dir ]]; then 
    mkdir $dir 
elif [[ ! -d $dir ]]; then 
    echo "$Message" 1>&2 
fi 
40
if [ ! -d directory ]; then 
    mkdir directory 
fi 

hoặc

mkdir -p directory 

-p đảm bảo sự sáng tạo nếu directory không tồn tại

+2

Một lớp lót yêu cầu thêm ';': 'nếu [! -d thư mục]; sau đó thư mục mkdir; fi' – sdgfsdh

Các vấn đề liên quan