Làm cách nào để sử dụng Bash để tạo thư mục nếu nó chưa tồn tại?


179
#!/bin/bash
if [!-d /home/mlzboy/b2c2/shared/db]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;

Điều này dường như không hoạt động. Có ai giúp được không?


4
Tại sao bạn có dấu chấm phẩy?
ADTC

1
;thông báo là một dấu tách lệnh, dòng mới cũng vậy. Như thenlà một lệnh riêng biệt, dấu chấm phẩy trước là cần thiết để có thể viết nó trong cùng một dòng. Dấu chấm phẩy sau mkdirfilà siêu.
Andreas Riedmüller

Câu trả lời:


278

Đầu tiên, trong bash "[" chỉ là một lệnh, dự kiến ​​chuỗi "]" là đối số cuối cùng, do đó, khoảng trắng trước dấu ngoặc đóng (cũng như giữa "!" Và "-d" cần phải là hai đối số riêng biệt quá) là quan trọng:

if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
  mkdir -p /home/mlzboy/b2c2/shared/db;
fi

Thứ hai, vì bạn đang sử dụng chuyển đổi -p sang mkdir, kiểm tra này là vô ích, bởi vì đây là những gì làm ở nơi đầu tiên. Chỉ viết:

mkdir -p /home/mlzboy/b2c2/shared/db;

và đó là nó.


2
Lưu ý: -pcờ làm cho bất kỳ thư mục cha mẹ được tạo nếu cần thiết.
Danijel

13
Chúa ơi, tôi chưa bao giờ biết rằng "[" là một mệnh lệnh. Điều này giải thích rất nhiều vấn đề của tôi ... Dễ dàng là điều hữu ích nhất tôi từng đọc trên StackOverflow.
Ben Kushigian

1
Ồ Biết rằng "[" là một lệnh trong bash là một công cụ mở mắt như vậy. Tôi cảm thấy như rất nhiều vấn đề với các tập lệnh bash của tôi đã được giải quyết!
raluru

93

Thực sự không cần phải kiểm tra xem nó có tồn tại hay không. Vì bạn đã muốn tạo nó nếu nó tồn tại, chỉ cần mkdir sẽ làm

mkdir -p /home/mlzboy/b2c2/shared/db

2
Lưu ý: -pcờ làm cho bất kỳ thư mục cha mẹ được tạo nếu cần thiết.
Danijel

67

Đơn giản chỉ cần làm:

mkdir /path/to/your/potentially/existing/folder

mkdir sẽ đưa ra một lỗi nếu thư mục đã tồn tại. Để bỏ qua các lỗi viết:

mkdir -p /path/to/your/potentially/existing/folder

Không cần phải làm bất kỳ kiểm tra hoặc bất cứ điều gì như thế.


Để tham khảo:

-p, --parents no error if existing, make parent directories as needed http://man7.org/linux/man-pages/man1/mkdir.1.html


3
Đối số -pkhông bỏ qua chính xác các lỗi: nó gọi một chế độ khác trong đó bất kỳ thành phần đường dẫn nào không tồn tại được tạo ra (và do đó nó không phải là lỗi nếu xảy ra mà không cần phải tạo). Hành vi là khác nhau vì nó sẽ tạo ra các thành phần khác với thành phần cuối cùng, có thể hoặc không mong muốn.
BeeOnRope

23

Bạn cần khoảng trắng bên trong []dấu ngoặc:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ] 
then
    mkdir -p /home/mlzboy/b2c2/shared/db
fi

18

Cách sạch hơn, khai thác đánh giá lối tắt của toán tử logic vỏ. Bên phải của toán tử chỉ được thực hiện nếu bên trái là đúng.

[ ! -d /home/mlzboy/b2c2/shared/db ] && mkdir -p /home/mlzboy/b2c2/shared/db

11
mmh, không sạch hơn: chỉ ngắn hơn. Thật khó để hiểu ý nghĩa của một tuyên bố như vậy nếu bạn đi qua nó.
Davide Orazio Montersino

1
Tôi thích điều này, mặc dù -plập luận làm cho việc kiểm tra không cần thiết. Bạn vẫn có thể sử dụng nó khi bạn không muốn sử dụng -p, đó là khi bạn không muốn tất cả các thư mục mẹ được tạo tự động.
ADTC

3
Trên thực tế, nó thậm chí còn ngắn hơn để viết [ -d /path/to/dir ] || mkdir /path/to/dir.. bên phải được thực thi khi bên trái là sai.
ADTC

4

Tôi nghĩ bạn nên định dạng lại mã của mình một chút:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.