kiểm tra xem thư mục có tồn tại không và xóa trong một lệnh unix


106

Có thể kiểm tra xem một thư mục có tồn tại hay không và xóa nếu có, trong Unix bằng một lệnh duy nhất? Tôi gặp trường hợp khi sử dụng tác vụ ANT 'sshexec', nơi tôi chỉ có thể chạy một lệnh duy nhất trong máy từ xa. Và tôi cần kiểm tra xem thư mục có tồn tại hay không và xóa nó ...


tại sao không chỉ sử dụng rmdir? nếu thư mục không tồn tại, nó sẽ bị lỗi.
Ferruccio

4
Nó sẽ thất bại. Và lỗi trong tập lệnh ANT của tôi. Điều đó sẽ gây ra sự cố xây dựng của tôi.
remoing

Việc sử dụng mkdir -psẽ bỏ qua lỗi nếu nó đã tồn tại.
user562374

2
@ Ferruccio- using rm -rf / dir_name không gặp lỗi nhưng rm -rf / dir_name ném thông báo Không tìm thấy tệp hoặc thư mục như vậy. (Vừa được kiểm tra)
remo

3
@remo bro bạn chỉ cần gửi lệnh tương tự hai lần
Marcos Pereira

Câu trả lời:


149

Giả sử $WORKING_DIRđược đặt thành thư mục ... một lớp lót này sẽ làm điều đó:

if [ -d "$WORKING_DIR" ]; then rm -Rf $WORKING_DIR; fi

(nếu không chỉ cần thay thế bằng thư mục của bạn)


161

Tại sao không chỉ sử dụng rm -rf /some/dir? Điều đó sẽ xóa thư mục nếu nó hiện diện, nếu không thì không làm gì cả. Không giống như rm -r /some/dirhương vị này của lệnh sẽ không bị sập nếu thư mục không tồn tại.


13
Tôi nghĩ câu hỏi ban đầu có ý nghĩa là: chỉ thực hiện xóa khi tệp / thư mục tồn tại hoặc không. Lệnh này có thể hoạt động và tạo ra kết quả tương tự nhưng thực sự việc kiểm tra trước khi lệnh này có ý nghĩa hơn.
Ankur Chauhan

5
@AnkurChauhan +1, tôi đã nhận được cảnh báo nếu dir không tồn tại.
inf3rno

12
Đây không phải là câu trả lời cho câu hỏi.
xpto

10
Như đã nói ở trên, đây không phải là câu trả lời. Một lý do để kiểm tra trước khi xóa là bên trong công việc của Jenkins. Nếu thư mục không tồn tại và bạn cố gắng xóa nó, điều đó sẽ không thành công. Kiểm tra trước là lựa chọn tốt hơn.
lumberjacked vào

8
Tôi nghĩ đây là câu trả lời chính xác. nó thực hiện những gì @remo cần, tức là chỉ xóa một thư mục nếu nó tồn tại và không báo lỗi nếu không. Có thể câu hỏi không được đặt ra khá tốt vì tại sao bạn cần kiểm tra sự tồn tại khi lệnh này không quan tâm ?!
pedram bashiri

32

Thử:

bash -c '[ -d my_mystery_dirname ] && run_this_command'

CHỈNH SỬA : Điều này sẽ hoạt động nếu bạn có thể chạy bash trên máy từ xa ....

CHỈNH SỬA 2 : Trong bash, hãy [ -d something ]kiểm tra xem có thư mục nào được gọi là 'cái gì đó' không, trả về mã thành công nếu nó tồn tại và là một thư mục. Chuỗi lệnh với && chỉ chạy lệnh thứ hai nếu lệnh đầu tiên thành công. Vì vậy, chỉ [ -d somedir ] && commandchạy lệnh nếu thư mục tồn tại.


Có, và hãy thử nó trong một chiếc vỏ để đảm bảo đó là thứ bạn muốn.
sinelaw

Đầu tiên, tôi muốn xem nó có hoạt động cục bộ hay không và tôi có thể gửi lệnh từ xa. Tôi đang xem nói kiểm tra thư mục "/ test "..just [-d / test] && mkdir / test?
remoing

1
Nó sẽ báo lỗi nếu nó tồn tại, vì nó sẽ kiểm tra xem thư mục có tồn tại hay không và nếu có nó sẽ cố gắng tạo nó. Đó là những gì nó làm cho tôi (vừa được thử nghiệm). Nó không nên tạo một thư mục. Vì bạn muốn DELETE có lẽ bạn cần: [ -d /test ] && rmdir /test(hoặc rm -rf / kiểm tra nếu nó không được sẽ được sản phẩm nào và bạn muốn xóa tất cả các nội dung)
sinelaw

@SineLaw: LƯU Ý - Không có lỗi khi thư mục tồn tại đối với tôi và cố gắng tạo một thư mục! (đã test lại). Nhưng đối với DELETE, nó hoạt động. Vui lòng kiểm tra kỹ điều đó
remoing

sharma: bạn đang sử dụng bash? 'echo $ SHELL' nói gì?
sinelaw

0

Đây là một lớp lót khác:

[[ -d /tmp/test ]] && rm -r /tmp/test
  • && có nghĩa là thực hiện câu lệnh theo sau chỉ khi câu lệnh trước đó được thực thi thành công (mã thoát trả về số 0)
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.