Ghi đè một thư mục hiện có?


11

Tôi có một tên thư mục foonằm trong ~/Desktop. Giả sử tôi muốn tạo một thư mục từ một thiết bị đầu cuối có cùng tên và trong cùng một vị trí. Khi tôi thử mkdirnó đã báo lỗi:

mkdir: cannot create directory `/home/nux/Desktop/foo': File exists

Đó là ý nghĩa, nhưng tôi muốn thay thế foonếu tồn tại. Tôi đã xem qua man mkdirnhưng không có lựa chọn nào làm được điều đó.

Vậy làm thế nào để ghi đè foothư mục?

Tại sao không mkdircó tùy chọn để làm điều này?


Thay thế foonhư trong xóa tất cả nội dung của nó? mkdircó một -ptùy chọn bỏ qua nếu thư mục tồn tại.
muru

4
Vì vậy, bạn muốn một lệnh sẽ xóa tất cả các tệp trong một thư mục khi bạn vô tình tạo một thư mục mới có cùng tên? Và bạn tự hỏi tại sao nó không phải là bất kỳ lựa chọn? Đây co phải la một tro đua?
Marty Fried

downvoters chỉ cần làm rõ lý do tại sao, tôi đang hỏi về một lệnh xóa một thư mục hiện có
nux

1
@nux với tôi câu hỏi không có ý nghĩa gì ... giải thích lý do tại sao bạn muốn xóa và tạo lại một thư mục. Chúng tôi có các lệnh cho bất cứ điều gì bạn cần làm cho thư mục. mkdir không cần một tùy chọn để loại bỏ / tạo lại.
Rinzwind

1
nó có phải là một tội ác ở đây không nếu tôi đang hỏi một câu hỏi logic !!
nux

Câu trả lời:


21

Nếu mục tiêu của bạn là thực thi lệnh một dòng:

  • Loại bỏ và tạo lại thư mục ~/Desktop/foonếu nó đã tồn tại.
  • Chỉ cần tạo thư mục ~/Desktop/foonếu nó chưa tồn tại.

Sau đó, bạn có thể sử dụng:

rm -r ~/Desktop/foo; mkdir ~/Desktop/foo

; tương đương với một dòng mới, nhưng nó cho phép bạn thực thi nhiều lệnh trên một dòng (nghĩa là "một lệnh").

  • Nếu thư mục bạn đang xóa có thể chứa các tệp chỉ đọc, bạn sẽ cần -fcờ để xóa chúng mà không cần nhắc người dùng tương tác. Điều này không sao, nhưng tôi khuyên bạn nên đặc biệt cẩn thận rm -rf .... Xem man rmđể biết chi tiết.
  • Bạn cần rmlệnh để kết thúc trước khi mkdirlệnh thực thi; đây là lý do để sử dụng ;thay vì &. (Một lệnh trước &chạy không đồng bộ trong nền.)
  • Bạn cần mkdirlệnh để chạy khi rmlệnh thành công; đây là lý do để sử dụng ;thay vì ||.
  • Bạn cần mkdirlệnh để chạy khi rmlệnh thất bại (thông thường thất bại sẽ có nghĩa là thư mục đã không tồn tại); đây là lý do để sử dụng ;thay vì &&.
  • Các rmlệnh có thể thất bại ngay cả khi thư mục đã tồn tại, trong trường hợp đó mkdirlệnh sẽ thất bại cũng có, nhưng các thông báo lỗi sẽ có ý nghĩa và có lẽ không cần phải thêm một kiểm tra bước trung cho foo's tồn tại trước khi cố gắng để tạo ra nó.

Xem 3.2.3 Danh sách các lệnh trong tay Bash Reference để biết thêm thông tin và giải thích về ;, &, ||, và &&các nhà khai thác.

Như muru đã đề xuất (và Rinzwind xây dựng ), tôi khuyên bạn nên xem xétrsync xem nó có đáp ứng nhu cầu sao lưu của bạn không. Có một số hướng dẫn hữu ích bổ sung trên trang tài liệu rsync , cũng như hướng dẫn rsync Ubuntu này .

Tại sao mkdir không có tùy chọn này?

mkdirtạo thư mục ("mk" là viết tắt của "make" ). Đối với nó cũng để xóa đệ quy các thư mục và tất cả các tệp trong đó sẽ là xấu, bởi vì nó sẽ vi phạm nguyên tắc ít gây ngạc nhiên theo cách có thể dẫn đến mất dữ liệu.

rmdirthậm chí không xóa các thư mục có bất kỳ tệp (không phải thư mục) nào trong đó. rmcó một -rtùy chọn, điều này hợp lý vì rmdự kiến ​​sẽ loại bỏ các tệp (đó là mục đích của nó, do đó, mối nguy hiểm vốn có là trực quan và người dùng thường biết cẩn thận khi chạy rmlệnh).


+1 xuất sắc. Câu trả lời này vượt lên trên và trong việc giải thích cú pháp, một điều tôi mong muốn sâu sắc hơn trên các trang web stackexchange. Có rất nhiều cốm vàng trong câu trả lời này.
Govind Rai

7

Không, không có lệnh duy nhất để làm những gì bạn đang yêu cầu.

Tại sao?

Đây là triết lý của Unix: Viết các chương trình làm một việc và làm tốt. Viết chương trình để làm việc cùng nhau. 1

Trong trường hợp này, các lệnh mkdirrmlệnh thực hiện những gì bạn yêu cầu và hoạt động tốt với nhau, vì rm -rnó cũng sẽ xóa thư mục, do đó, sau đó mkdirsẽ tạo thư mục.

1 Nghệ thuật lập trình Unix , Eric S. Raymond, tự trích dẫn Doug McIlroy.


cho bây giờ, đó là một câu trả lời tốt, tôi sẽ tìm kiếm cho rằng
nux

3

Lệnh để loại bỏ một thư mục là rm. Vì vậy, bạn cần 2 lệnh.

rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/

Như được thể hiện trong các bình luận, bạn có thể xâu chuỗi chúng bằng ;(= làm cả hai ngay cả khi 1st thất bại) hoặc &&(= chỉ mkdir khi rm không thất bại).

Đây -rlà để loại bỏ dirs. Lệnh 1 cũng loại bỏ TẤT CẢ nội dung của thư mục. Nếu đó không phải là ý định của bạn thì cả rm và mkdir không phải là thứ bạn đang tìm kiếm: quyền là chmodchown.

Tại sao mkdir không có tùy chọn này?

Sự mơ hồ. mkdircó nghĩa là tạo thư mục. Không loại bỏ và tạo thư mục. Và vì rmlệnh này là để xóa các công cụ, nên không cần phải rmdircó thể xóa một thư mục.


Tôi biết điều đó, nhưng ý tôi là một lệnh, bạn có thể xem bản chỉnh sửa của mình, tôi thay đổi nó
nux

1 giải thích lý do tại sao bạn cần tạo lại thư mục. Điều đó vô nghĩ với tôi.
Rinzwind

là nhu cầu của tôi có ý nghĩa, tôi chỉ tự hỏi làm thế nào? nó có ý nghĩa với tôi :)
nux

@nux không có. Và người duy trì mkdir cũng không hiểu tại sao;) Những gì bạn muốn là vô ích và không có công đức.
Rinzwind

ok nếu bạn muốn biết đang tạo một kịch bản để tạo bản sao lưu trong một thư mục mới có cùng tên của foo và cho phép thay thế nó nếu tồn tại để giảm dung lượng
nux

1

Để làm điều đó theo cách sạch nhất tôi sử dụng điều này:

create_clean_directory(){
    dir_name=$1
    if [ -d "$dir_name" ]; then
        echo "Removing $dir_name"
        rm -rf "$dir_name"
    elif [ -f "$dir_name" ]; then
        echo "File with this name already exists, not a directory."
        exit
    fi
    if mkdir "$dir_name"; then
        echo "Clean directory created: $dir_name"
        return 0
    else
        echo "Creating directory failed: $dir_name"
        return 1
    fi 
}

Và để sử dụng nó:

create_clean_directory <dir_name>

Điều này đảm bảo rằng những gì bạn đang cố xóa là một thư mục chứ không phải tệp:

  1. -dKiểm tra nếu một thư mục với tên đó đã tồn tại. Nếu vậy, xóa nó.

  2. -fKiểm tra rằng không có tập tin với tên này tồn tại. Nếu vậy, in thông báo lỗi và thoát.

  3. Tạo thư mục mới và echo thành công, hoặc nếu thất bại, echo thất bại.

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.