Làm thế nào để loại bỏ tất cả các tập tin từ một thư mục?


289

Gần nhất tôi đã nhận được là

# rm /path/to/directory/*.*

nhưng nó không hoạt động đối với các tệp không có tiện ích mở rộng ...

Câu trả lời:


340

Linux không sử dụng các phần mở rộng. Tùy thuộc vào người tạo tệp để quyết định xem anh ta có muốn tên đó có phần mở rộng hay không. Linux nhìn vào byte thứ 1 để tìm ra loại tệp nào đang xử lý.

Để xóa mọi thứ trong thư mục, hãy sử dụng:

rm /path/to/directory/*

Bạn có thể sử dụng -rtùy chọn, ví dụ:

rm -r /path/to/directory/*

để xóa bất kỳ thư mục con nào (cùng với tất cả nội dung của chúng) trong thư mục bạn đang xóa nội dung của. Nếu không, nó sẽ hiển thị một lỗi thông báo cho bạn rằng nó không xóa thư mục.


13
Nếu bạn cũng muốn xóa các tệp ẩn chạy shopt -s dotglobtrước khi chạyrm (...)
danjjl

7
* Nghĩa là all files;) *.*có nghĩa là tất cả các tệp có chứa một .nơi nào đó trong tên
Rinzwind

10
@Rinzwind, chính xác hơn, dấu hoa thị có nghĩa là "không hoặc nhiều hơn bất kỳ ký tự nào". Vì vậy, *a*có nghĩa là không hoặc nhiều ký tự, theo asau là 0 hoặc nhiều ký tự. Nó sẽ phù hợp với tên tập tin happy, apple, ahoặc la.
DisgruntledGoat

7
@ user784637 bạn quá dễ bị ấn tượng
barlop

1
Đây là lệnh bạn muốn: rm - *
anon58192932

168
  • Để xóa thư mục có tất cả nội dung của nó ( bao gồm tất cả các thư mục bên trong ):

    rm -rf /path/to/directory
    
  • Để xóa tất cả nội dung của thư mục ( bao gồm tất cả các thư mục bên trong ) nhưng không xóa chính thư mục đó:

    rm -rf /path/to/directory/*
    

    hoặc là

    rm -rf /path/to/directory/{*,.*}
    

    nếu bạn muốn đảm bảo rằng các tập tin / thư mục ẩn cũng bị xóa.

  • Để xóa tất cả các "tệp" từ bên trong một thư mục ( không xóa các thư mục bên trong ):

    rm -f /path/to/directory/{*,.*}
    


  • Cảnh báo : nếu bạn có khoảng trắng trong đường dẫn, hãy đảm bảo luôn sử dụng dấu ngoặc kép.

    rm -rf /path/to the/directory/*
    

    tương đương với 2 rm -rfcuộc gọi riêng biệt :

    rm -rf /path/to
    rm -rf the/directory/*
    

    Để tránh vấn đề này, bạn có thể sử dụng 'dấu ngoặc đơn '( không mở rộng biến shell) hoặc "dấu ngoặc kép "( mở rộng biến shell):

    rm -rf "/path/to the/directory/"*
    


Ở đâu:

  • rm- là viết tắt của " loại bỏ "
  • -f- là viết tắt của " lực lượng " hữu ích khi bạn không muốn được hỏi / nhắc nếu bạn muốn xóa một kho lưu trữ, chẳng hạn.
  • -r- là viết tắt của " đệ quy " có nghĩa là bạn muốn đi đệ quy xuống mọi thư mục và xóa mọi thứ.

8
Tôi thấy đây là câu trả lời toàn diện và hữu ích hơn, hơn và hơn câu trả lời được đánh dấu là Đã chấp nhận.
lấy cảm hứng từ

2
rm -rf /path/to/directory/*không xóa một tập tin ẩn trong thư mục, vd .htaccess. Có lẽ rm -rf /path/to/directory/.nào? Không thử nó.
Mark Berry

@Mark BlackBerry rm -rf /path/to/directory/.*
Lilian A. Moraru

@ LilianA.Moraru, tôi đã làm một số thử nghiệm ngày hôm nay. rm -rf /path/to/directory/.*chỉ xóa (các) tệp ẩn trong thư mục được chỉ định. Nhìn vào nhận xét của @ danjjl về câu trả lời của @ Rinzwind, để xóa các tệp bị ẩn, hãy chạy shopt -s dotglobtrước khi chạy rm -rf /path/to/directory/*.
Mark Berry

THẬN TRỌNG: rm -rf /path/to/directory/.*trên hệ thống của tôi gây ra việc xóa các mục trong /path/to. May mắn thay, tôi vừa sao lưu toàn bộ dữ liệu của mình vào một đĩa riêng. Không cần phải nói, KHÔNG phát lệnh rm -rf /path/to/directory/.*trừ khi bạn đã sao lưu toàn bộ máy tính của mình vào một vị trí riêng biệt / an toàn!
luật

43

Để xóa tất cả các tệp trong thư mục (bao gồm các tệp ẩn và thư mục con) hãy chạy:

rm -rf /path/to/directory/{*,.*}

1
Đây nên là câu trả lời đẹp được chấp nhận. Cảm ơn bạn!
Nam G VU

3
Không phải thế giới này phù hợp "." và cũng?
hertzsprung

4
@hertzsprung - nó có, và nó sẽ đưa ra một cảnh báo rằng nó không thể xóa ./../, nhưng nó vẫn sẽ xóa các tập tin ẩn.
Ryan Wheale

Điều này không hoạt động trên bảng điều khiển Mac, các tệp ẩn vẫn ở đó với dòng lệnh đó.
agapitocandemor

Để xóa mọi thứ trong thư mục hiện tại:rm -r $(pwd)/{*,.*}
Jimmy Adaro

10

Nếu bạn chỉ muốn xóa các tệp trong thư mục / path / to /, bạn có thể làm

find /path/to/directory -type f -print0| xargs -0 rm 

hoặc là

find /path/to/directory -type f -exec rm '{}' \;

Bạn có thể tải với find, lợi thế là bạn có thể liệt kê những gì được tìm thấy mà không cần đường ống để rmbạn có thể thấy những gì sẽ bị xóa trước khi bạn bắt đầu.


2
GNU findnhư một -deletevị ngữ Nếu bạn vẫn muốn sử dụng -exec, thay thế \;bằng +sẽ tập hợp rmcác cuộc gọi lại với nhau, tăng hiệu quả.
enzotib

1
số lượng lớn tệp có '+' sẽ gây ra sự cố, vì danh sách sẽ quá lớn, giống như rm -f *. và khi loại bỏ một lượng lớn tệp từ cùng một thư mục (nói bằng millon) thì cả hai đều không tốt :) Cuối cùng, C ++ xuất hiện và xóa các tệp theo thứ tự inodes trong dir-tree.
Osis

3
Bạn thực sự nên thêm một - sau rm. Nếu không có điều đó, nếu bạn có một tên tệp -rf hoặc tương tự sẽ được hiểu là đối số cho rm. ví dụ: xargs -0 rm - hoặc -exec rm - {} \;
Richm

bạn cũng có thể cung cấp đối số -n cho xargs. Điều đó sẽ khiến nó phân tách các lệnh rm để có số lượng đối số tối đa, ví dụ 'xargs -n 100 -0 rm -' sẽ xóa các tệp trong các khối 100.
Richm

1
Bạn cũng có thể thêm -maxdepth 1 để đảm bảo rằng find không trả về các tệp từ bất kỳ thư mục con nào. tức là find / path / to / thư mục -maxdepth 1 -type f
Richm

7

Để xóa tất cả các tệp và thư mục (bao gồm cả các tệp ẩn ) trong một thư mục, bạn có thể thử các cách sau:

  • xóa thư mục, sau đó tạo lại nó

    rm -rf dir_name && mkdir dir_name
    
  • sử dụng find

    find dir_name -mindepth 1 -delete  
    

Ở đây chúng tôi chỉ định -mindepth 1để loại trừ thư mục dir_name chính nó.
Hãy xem liên kết sau:
https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory


Cảm ơn lời khuyên của bạn và tôi đã thêm lời giải thích cho các liên kết.
zeekvfu

3
Hãy cẩn thận, vì việc xóa và tạo lại thư mục có thể dẫn đến các quyền khác nhau / sai cho thư mục này!
einjohn

6

Nếu bạn cũng muốn xóa tất cả các thư mục con và thư mục chính nó, bạn có thể sử dụng rm -rf /path/to/directory. Nhưng luôn luôn kiểm tra kỹ dòng của bạn trước khi nhấn return, rm -rfcũng có thể gây ra nhiều havock, ví dụ: nếu bạn vô tình chèn một khoảng trắng sau dấu gạch chéo đầu tiên trong khi có quyền siêu người dùng ...


1

Vì câu hỏi này liên tục đứng đầu Google khi tôi tự tìm kiếm câu hỏi này:

Các câu trả lời khác bị các vấn đề khác nhau:

  1. Một số trong số họ bao gồm ...đó là ồn ào, khó hiểu và gây phiền nhiễu.

  2. Một số trong số họ quên các tệp ẩn (các tệp bắt đầu bằng dấu chấm).

  3. Họ không xóa theo thứ tự chính xác (sâu nhất trước tiên) để cho phép xóa thư mục.

  4. Họ đi xuống các hệ thống tập tin (gắn kết) khác, thường không mong muốn.

  5. Chúng rất khó để mở rộng đúng cách với các tham số bổ sung (nhiều hơn ở bên dưới).

Vì vậy, để RECURSIVELY xóa tất cả các tệp VÀ thư mục trong một thư mục, hãy làm điều này:

find "${DIR}" -xdev -mindepth 1 -printf "%d\t%y\t%p\0" | sort -z -r -n | cut -z -f3- | xargs -0 -r -- rm -d --

Lưu ý rằng tôi đã thêm một -xdevđối số để ngăn giảm dần vào mount (như /procv.v.).

Tại sao không -depthhay -delete?

Mặc dù mọi người liên tục hạ thấp tôi vì điều này, những phương pháp đó có một nhược điểm: có vẻ như chúng không đủ khả năng mở rộng để cho phép sử dụng -prunethư mục con (mà không đưa ra nhiều vấn đề hơn). Ngược lại với phương pháp này, bạn có thể chèn

-not \( -path "${DIR}/subdir" -prune \)

trước -mindepthđối số để loại trừ subdirkhỏi việc xóa nội dung của nó.


Và theo chiều sâu - thứ tự đầu tiên, có một -depthlá cờ findcho điều đó.
Sergiy Kolodyazhnyy

Uh ... tại sao không sử dụng -deletevớifind ? -deletelà chiều sâu đầu tiên. Bạn đã giả sử không phải POSIX findvới -printf, vì vậy bạn cũng có thể sử dụng -deletehoặc-depth -print0 | xargs -0 rm
muru

@muru: Bởi vì tôi không biết rõ hơn ... Tôi sẽ thay đổi nó.
Mehrdad

@muru: Thật ra, có vẻ như phương pháp của bạn không hoạt động với -not \( -path "$DIR/subdir" \)... nhưng tôi thì sao? Tại sao?
Mehrdad

@Mehrdad đó là phải làm gì?
muru

0

Bạn có thể cdvào thư mục và sau đó chạy lệnh rm *.*giống như trong DOS nếu bạn nhớ.


1
DOS là DEL cho các tệp và RMDIR cho các thư mục trống - và các tệp hệ thống bị ẩn và phải loại bỏ các thuộc tính ATTRIB đó trước tiên. Không đơn giản như vậy;)
Eric

0

Để xóa thư mục hiện tại, ví dụ bạn có thể sử dụng rm -d ./*

-d nói để xóa các thư mục là tốt.

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.