Câu hỏi Làm thế nào để mkdir chỉ khi một thư mục không tồn tại?


Tôi đang viết một kịch bản shell để chạy dưới KornShell (ksh) trên AIX. Tôi muốn sử dụng mkdir lệnh để tạo một thư mục. Nhưng thư mục có thể đã tồn tại, trong trường hợp này tôi không muốn làm gì cả. Vì vậy, tôi muốn kiểm tra xem thư mục có tồn tại hay không hoặc loại bỏ lỗi "Tệp tồn tại" mkdir ném khi nó cố gắng tạo một thư mục hiện có.

Bất kỳ suy nghĩ về cách tốt nhất để làm điều này?


1333
2018-04-27 14:47


gốc




Các câu trả lời:


Thử mkdir -p:

mkdir -p foo

Lưu ý rằng điều này cũng sẽ tạo ra bất kỳ thư mục trung gian nào không tồn tại; ví dụ,

mkdir -p foo/bar/baz

sẽ tạo thư mục foo, foo/barfoo/bar/baz nếu chúng không tồn tại.

Nếu bạn muốn có lỗi khi thư mục gốc không tồn tại và muốn tạo thư mục nếu nó không tồn tại thì bạn có thể test cho sự tồn tại của thư mục đầu tiên:

[ -d foo ] || mkdir foo

2318
2018-04-27 14:49



ví dụ rút ngắn bạn sử dụng chính xác là những gì bạn không nên làm. Nó đang đảo ngược logic để tiết kiệm không gian mã hóa nhưng nó nên sử dụng! và && và có ý nghĩa hơn với những người đọc nó. - Mike Q
@AndreasLarsen Câu hỏi này là về mkdir trên các hệ thống giống Unix, không phải trên Windows. -p được yêu cầu cho tuân thủ Đặc điểm kỹ thuật của POSIX / Single Unix, vì vậy bất kỳ thứ gì có ý định tuân thủ các thông số kỹ thuật đó sẽ hỗ trợ -p. Windows hoàn toàn khác, trừ khi bạn sử dụng một lớp mô phỏng POSIX như Cygwin hoặc MSYS. - Brian Campbell
Tôi đã khám phá điều thú vị hôm nay với mkdir -p, bạn có thể sử dụng dấu ngoặc! {} để tạo cây thư mục "phức tạp" trong một lệnh. Xem ở đây: technosophos.com/2010/04/15/… - herve
@MikeQ Tôi thích || thay vì && bởi vì sau đó toàn bộ dòng có trạng thái thoát phải. Quan trọng nếu shell của bạn chạy với errexit hoặc nếu dòng đó là dòng cuối cùng trong hàm, trường hợp chuyển đổi, bất cứ điều gì. - rudimeier
@herve Điều đó không liên quan gì đến mkdir; trình bao mở rộng một biểu thức như vậy thành một danh sách đối số rời rạc được chuyển tới mkdir. - chepner


Điều này sẽ hoạt động:

$ mkdir -p dir

hoặc là:

if [[ ! -e $dir ]]; then
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$dir already exists but is not a directory" 1>&2
fi

sẽ tạo thư mục nếu nó không tồn tại, nhưng cảnh báo bạn nếu tên của thư mục bạn đang cố gắng tạo đã được sử dụng bởi một thứ gì đó không phải là thư mục.


109
2018-04-27 14:50



Tôi không nghĩ rằng có một nhà điều hành -d trong korn, thay vì -e được sử dụng cho cả hai tập tin / thư mục và chỉ kiểm tra sự tồn tại. Ngoài ra, tất cả đều trở về 0 khi thành công, vì vậy! là thừa. Đúng nếu tôi sai. - alkar
sai cả về số lượng, AFAIK. kiểm tra trở lại thật về thành công, và -d tồn tại quá (ít nhất là trên MacOS X) - Alnitak
nó có thể là đáng nói đến rằng điều này không phải là khá an toàn thread. giữa thời gian bạn kiểm tra xem thư mục có tồn tại không và thời gian bạn cố viết, mọi thứ có thể thay đổi. - Justin L.


Sử dụng cờ -p.

man mkdir
mkdir -p foo

70
2018-04-27 14:50





Xác định cây thư mục phức tạp bằng một lệnh

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

58
2017-08-21 20:08



không có lỗi nếu có, tạo thư mục cha khi cần - Fedir RYKHTIK
Hãy nhớ rằng đây không phải là một tính năng của mkdir chính nó, nhưng vỏ thực hiện lệnh. Nó được gọi là mở rộng cú đúp - AFAIK, chỉ Bash, ksh, zsh và vỏ C hỗ trợ nó. - Daniel Kamil Kozar
nếu bạn có khoảng trống xung quanh dấu phẩy, bạn có thể (sẽ) nhận được kết quả không mong muốn. Cẩn thận. - Atlas7
Tôi đã thử nó trong bash, và nó hoạt động hoàn hảo. - Ada Lovelace
@ Atlas7 đã nói, bạn sẽ cần phải thoát khỏi các ký tự thường là một phần của regex. (tức là thay vì sử dụng folder name bạn cần sử dụng folder\ name) - John Hamilton


Nếu bạn không muốn hiển thị bất kỳ thông báo lỗi nào:

[ -d newdir ] || mkdir newdir

Nếu bạn muốn hiển thị thông báo lỗi của riêng mình:

[ -d newdir ] && echo "Directory Exists" || mkdir newdir

20
2018-03-27 03:57





Người già đã cố gắng và đúng sự thật

mkdir /tmp/qq >/dev/null 2>&1

sẽ làm những gì bạn muốn với không có điều kiện chủng tộc nào trong số các giải pháp khác có.

Đôi khi, các giải pháp đơn giản nhất (và xấu nhất) là tốt nhất.


17
2018-01-20 12:23



Điều này sẽ thất bại nếu "tmp" không tồn tại. cũng không cung cấp cho bạn bất kỳ xác nhận. - Mike Q


mkdir foo hoạt động ngay cả khi thư mục tồn tại. Để làm cho nó chỉ hoạt động nếu thư mục có tên "foo" không tồn tại, hãy thử sử dụng -p cờ.

Thí dụ :-

mkdir -p foo

Điều này sẽ tạo thư mục có tên "foo" chỉ khi nó không tồn tại. :)


10
2017-12-16 11:34



Như đã đề cập bởi @BrianCampbell, điều này cũng sẽ tạo ra bất kỳ thư mục nào khác trong đường dẫn. Điều này có thể nguy hiểm nếu ví dụ: một ổ đĩa sẽ bị ngắt kết nối, vì nó có thể tạo các thư mục trong điểm gắn kết. - uliwitness


directory_name = "foo"

if [ -d $directory_name ]
then
    echo "Directory already exists"
else
    mkdir $directory_name
fi

9
2018-04-27 14:51





Hoặc nếu bạn muốn kiểm tra sự tồn tại trước:

if [[ ! -e /path/to/newdir ]]; then
            mkdir /path/to/newdir
fi

-e là thử nghiệm tồn tại đối với vỏ korn.

Bạn cũng có thể thử googling một hướng dẫn sử dụng vỏ korn.


7
2017-11-22 12:39





mkdir không hỗ trợ chuyển đổi -p nữa trên hệ thống Windows 8+.

Bạn có thể sử dụng điều này:

IF NOT EXIST dir_name MKDIR dir_name

2
2018-02-14 18:54



OP là về AIX kornshell ... không có gì để làm với Windows, phải không? - J. Chomel
Điều này có thể áp dụng được trong linux, không hoạt động cho tôi không - Abhi


Đây là một hàm đơn giản (bash shell) cho phép bạn tạo một thư mục nếu nó không tồn tại.

#----------------------------------
# Create a directory if it doesn't exist
#------------------------------------
createDirectory() {
    if [ ! -d $1 ]
        then
        mkdir -p $1
    fi
}

Bạn có thể gọi hàm trên là:

createDirectory / tmp / fooDir / BarDir

Ở trên tạo fooDir và BarDir nếu chúng không tồn tại. Lưu ý tùy chọn "-p" trong lệnh mkdir tạo thư mục đệ quy. Hi vọng điêu nay co ich.


0
2018-04-20 09:30