Rm -rf * sẽ xóa tất cả các tệp / thư mục trong thư mục hiện tại?


20

Sẽ rm -rf *loại bỏ tất cả các tập tin / thư mục trong thư mục hiện tại? Tôi muốn chắc chắn rằng ký tự đại diện *sẽ không di chuyển lên trong các thư mục phía trên và xóa tất cả hệ thống tập tin của tôi. : D

Tôi nhớ làm chmod 777 .* -Rvới chmodcác tập tin ẩn và nó chmoded tất cả các hệ thống tập tin của tôi. Rõ ràng, tôi đã vào tài khoản root.


1
Đây là lý do tại sao tôi làm rm -rf ./*và chỉ định rõ ràng thư mục hiện tại ... nhưng dường như Ankur nói nó không thành vấn đề.
mở

@Mark: sự khác biệt giữa .. và ./ .. là gì? Bạn có thể thử cd ./ .. và xem nơi bạn kết thúc :)
Johan

@Johan: Không có gì khác biệt ... Tôi đoán nó chỉ có ý nghĩa hơn trong cái đầu điên rồ của tôi: D
mpen

@Mark: dễ mắc lỗi :)
Johan

Câu trả lời:


15

Không, nếu bạn không chỉnh sửa vỏ của mình nhiều thì điều này sẽ không xóa các tệp hoặc thư mục bắt đầu bằng a .. Để loại bỏ chúng, bạn cũng có thể liệt kê chúng một cách rõ ràng

rm -rf .file .dir

hoặc sử dụng đúng mẫu hình cầu (cảm ơn Chris)

rm -rf .[^.]* ..?*

EDIT Điểm ở đây là bạn không thể sử dụng .*để khớp các tệp như .file, bởi vì .*hoặc .*?cũng sẽ khớp ..hoặc .. .[^.]*khớp các tệp như .file, trong khi ..?*khớp các tệp như ..foo( *khớp 0 hoặc nhiều ký tự trong khi ?khớp chính xác với một).


1
Bạn cũng cần một cái gì đó như ..?*để bắt các mục bắt đầu với tập .. .. (ví dụ ..foo).
Chris Johnsen

@Chris: OK, tôi bắt đầu sự điên rồ kén chọn này, bạn nói đúng;)
Benjamin Bannier

không chỉ sử dụng các mẫu hình cầu "đúng", mà còn về số lượng vật phẩm phù hợp. trong các thư mục có số lượng tệp khổng lồ, rất có thể shell không thể cung cấp 50k tệp trong một lượt rm. vì vậy, xóa nội dung của một thư mục bằng * không phải là cách khôn ngoan nhất, imho.
akira

Tôi nghĩ rằng giải thích xargslà một chút vượt quá phạm vi của câu hỏi này. Người ta có thể bắt đầu nghĩ về điều đó khi shell phàn nàn về danh sách đối số.
Benjamin Bannier

1
Tôi nghĩ rằng nó không nằm ngoài phạm vi bởi vì tôi nghĩ OP không chắc chắn làm thế nào để đạt được vấn đề / giải pháp cuối cùng của mình: xóa tất cả nội dung của thư mục. OP chỉ đang làm điều "sai" chung bằng cách có sẵn một giải pháp (một giải pháp tồi) và hỏi tại sao giải pháp này gây ra vấn đề. Cách tiếp cận tốt hơn sẽ là: "làm thế nào để xóa tất cả các tệp trong một thư mục mà không xóa chính thư mục đó?" Giải pháp của OP sẽ gây ra vấn đề do bản chất của cách hoạt động của Globing.
akira

12

Nếu bạn muốn xóa một thư mục và tất cả nội dung của nó, bạn có thể chdirvào thư mục mẹ và rm -rfthư mục đó theo tên, bỏ qua toàn bộ câu hỏi toàn cầu. Nếu bạn muốn xóa nội dung nhưng giữ thư mục, cách dễ nhất là xóa tất cả và sau đó tạo lại thư mục.

Nó là phức tạp để đưa ra một quả cầu sẽ phù hợp với tất cả các mục thư mục có thể lưu. và ..; thật dễ dàng để đưa ra một câu trả lời đơn giản (ví dụ, * .??*) sẽ hoạt động gần như luôn luôn trong thực tế. Điều này là ổn đối với việc sử dụng tương tác, vì nó dễ nhớ và những lần nó không hoạt động có thể bị bắt gặp sau một rm ls -a. Đối với một tập lệnh, việc xóa tất cả sẽ dễ dàng hơn và tạo lại thư mục trống.


1
Đó cũng là những gì tôi muốn đề xuất: vứt bỏ thư mục và thực hiện
akira

Ngay cả bạn không phải là câu trả lời, đó là một ý kiến ​​hay.
Johan

10

Vì tôi nghĩ câu hỏi này liên quan nhiều hơn đến những gì * làm (chứ không phải rm), chúng ta hãy thử một cách tiếp cận khác.


Nếu bạn không chắc chắn * làm gì, trước tiên bạn có thể "kiểm tra" bằng cách sử dụng lệnh vô hại như echo. Trước khi bạn chạy cái này, hãy thử đoán xem chúng sẽ hiển thị gì nếu bạn chạy chúng trong thư mục nhà của bạn.

echo *
echo .*

Nhưng trước tiên, hãy tạo ra một sân chơi để chúng ta có thể chơi với các ngôi sao và xem những gì chúng ta kết thúc.

mkdir ~/star_test/
cd ~/star_test/
>.file1
>file2

Bây giờ trong thư mục này, chúng tôi có điều này:

cj@zap:~/star_test$ ls -1a
.
..
.file1
file2

Bây giờ hãy chú ý những gì * mở rộng thành bằng cách sử dụng lệnh echo:

cj@zap:~/star_test$ echo *
file2
cj@zap:~/star_test$ echo .*
. .. .file1

Vì vậy, hãy xem những gì xảy ra với lệnh rm

cj@zap:~/star_test$ rm -rf *
cj@zap:~/star_test$ ls -1a
.
..
.file1

Như bạn thấy, anh ta chỉ xóa file2, vì * chỉ mở rộng thành file2. Nếu bạn gõ rm -rf. * Sẽ giống như viết

rm -rf . .. .file1

Và thành thật mà nói, điều đó không vui vẻ gì;)

Hy vọng điều này làm rõ phần * của câu hỏi của bạn.


Cập nhật: Tuy nhiên, như Ankur Goel chỉ ra rằng có một số loại bảo vệ được tích hợp vào rm (loại khác thường đối với các lệnh shell :)

Hãy tạo một sân chơi mới:

cd ~/star_test/
mkdir -p test1/test2/test3
sudo chown root.root test1
cd test1/test2/test3/
>.file1
>file2

Vì vậy, bây giờ chúng ta có lại điều này, nhưng với test1 được sở hữu bởi root là sự bảo vệ nếu rm bắt đầu trở nên điên loạn.

cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2  .file1
cj@zap:~/star_test/test1/test2/test3$ echo .*
. .. .file1

Vì vậy, hãy loại bỏ mọi thứ:

cj@zap:~/star_test/test1/test2/test3$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2

Và có vẻ như rm đã không loại bỏ. và .. ngay cả khi chúng tôi nói với anh ấy !!!

Vì vậy, sau câu trả lời dài này, nó trở nên an toàn để loại bỏ mọi thứ trong một thư mục với điều này:

rm -rf * .*

Nhưng tôi sẽ sử dụng điều này một cách cẩn thận, vì tôi không chắc tất cả các triển khai của rm hành xử như thế này!


7

Vâng. rm -rf sẽ chỉ xóa các tệp và thư mục trong thư mục hiện tại và sẽ không tăng lên cây tệp. rm cũng sẽ không theo các liên kết tượng trưng và xóa các tệp mà chúng trỏ tới, vì vậy bạn không vô tình cắt tỉa các phần khác trong hệ thống tệp của mình.


1

Nếu bạn không muốn tăng một cấp như mpez0 đã nói và rm -rfthư mục cụ thể này, có một cách để làm việc trên tất cả các thư mục / tệp ngoại trừ ...trong thư mục hiện tại bằng cách thực hiện:

rm -rf $(ls -A)

Tất nhiên, nếu bất kỳ thư mục / tệp nào chứa một trong các ký tự trong IFSbiến đặc biệt shell (ví dụ: khoảng trắng, tab, dòng mới), bạn có thể muốn thay đổi IFS trước, chạy lệnh, sau đó khôi phục IFS.


0

Một cách dễ dàng hơn nhiều để làm trống toàn bộ thư mục, cũng như tránh các vấn đề "quá nhiều đối số" được thảo luận trong câu trả lời này , chỉ đơn giản là xóa và tạo lại chính thư mục đó. Để đảm bảo điều này hoạt động chính xác khi bạn đang ở trong một thư mục symlinked, hãy sử dụng các dòng sau:

cd ..
rm -rf $(readlink -f yourdir) #remove the directory, treat the case of a symlink
                        # by using readlink, to recreate the linked-to directory
mkdir $(readlink -f yourdir) # recreate the directory to have it empty
cd yourdir

(Nếu bạn sử dụng yourdirthay vì $(readlink -f yourdir)bạn chỉ thay thế liên kết trong khi vị trí ban đầu vẫn đầy)


1
Điều này có thể phá vỡ mọi thứ dựa vào inode của thư mục và loại bỏ các quyền, atime / mtime / ctime / btime, các thuộc tính mở rộng và danh sách kiểm soát truy cập.
Daniel Beck

@DanielBeck cảm ơn, điểm tốt. Mặc dù tôi tự hỏi, điều gì sẽ hợp lệ dựa vào inode ngoài các liên kết cứng (trên các thư mục, dù sao cũng không được khuyến khích mạnh mẽ)? Nhưng quyền vv là quan trọng. Vì vậy, trong trường hợp chung nhất, có lẽ người ta nên sử dụng xargs...
Tobias Kienzler

OS X chứa một cơ chế có thể xử lý các tệp và thư mục được di chuyển xung quanh và vẫn giữ liên kết. Rõ ràng nhất trong menu Mở Tài liệu Gần đây . AFAICT, nó sử dụng các nút để thực hiện điều đó trong nội bộ. Thêm thông tin . Tôi sẽ không ngạc nhiên nếu các hệ thống khác triển khai một cái gì đó tương tự, ví dụ như trong API cho các chương trình GUI.
Daniel Beck
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.