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


76

Tôi đang cố gắng loại bỏ tất cả các tập tin và thư mục con trong một thư mục. Tôi đã sử dụng rm -rđể xóa tất cả các tệp, nhưng tôi muốn xóa tất cả các tệp thư mục con, ngoại trừ chính thư mục trên cùng.

Ví dụ, tôi có một thư mục hàng đầu như thế nào images. Nó chứa các tập tin header.png, footer.pngvà một thư mục con.

Bây giờ tôi muốn xóa header.png, footer.pngvà thư mục con, nhưng không images.

Làm thế nào tôi có thể làm điều này trong linux?


1
cd vào thư mục và thực hiện một rm -Rftrong tất cả các tập tin và thư mục trong đó.
Noufal Ibrahim

Câu trả lời:


59

Nếu thư mục cấp cao nhất của bạn được gọi images, sau đó chạy rm -r images/*. Điều này sử dụng toán tử shell shell *để chạy rm -rtrên mọi tệp hoặc thư mục bên trong images.


30
tập tin ẩn sẽ không bị xóa.
reto

50

Để xóa các tập tin ẩn, bạn phải xác định:

rm -r images/* images/.*

Với các vỏ có các khối u bao gồm ..., điều này sẽ dẫn đến một lỗi như

rm: cannot remove `.' directory `images/.'
rm: cannot remove `..' directory `images/..'

nhưng nó sẽ xóa các tập tin ẩn.

Một cách tiếp cận không có lỗi là sử dụng find / xóa với mindepth. Đây là gnu-find.

find images -mindepth 1 -delete

Phát hiện của bạn có thể thiếu -mindepthhoặc -deletevị ngữ, trong trường hợp đó, bạn có thể làm:

find images/. ! -name . -prune -exec rm -rf {} +

Đề xuất của tôi là sử dụng 'rm -r hình ảnh /.*' sẽ khớp với 'hình ảnh / ..' chứ không phải 'hình ảnh /../ ..'. Đệ quy không thể đi lên, vì 'hình ảnh /../ hình ảnh / ..' lại là cùng một thư mục.
người dùng không xác định

4
@DarkHeart rm .*không xóa .hoặc ..ít nhất là từ năm 1994 đối với các tiện ích GNU và có khả năng kể từ cuối thập niên 70 cho UNIX . Rất khó có khả năng bạn sẽ tìm thấy một hệ thống mà rm .*đi qua hệ thống tập tin hướng lên bên ngoài bảo tàng.
terdon

21

Để 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:

  • sử dụng ls -Abđể khớp với tất cả các tập tin / thư mục

    cd dir_name && rm -rf `ls -Ab`
    
  • sử dụng findđể khớp với tất cả các tập tin / thư mục

    find dir_name -mindepth 1 -delete
    

    hoặc, nếu bạn findkhông hỗ trợ -delete:

    find dir_name -mindepth 1 -exec rm -rf {}
    
  • xóa thư mục, sau đó tạo lại nó

    rm -rf dir_name && mkdir dir_name
    
  • trong bash

    shopt -s dotglob  
    rm -rf dir_name/*
    

Lưu ý rằng lệnh like rm -rf *không an toàn nếu bạn không có kiến ​​thức về các tệp trong một thư mục, bởi vì một tệp bắt đầu bằng -(gạch nối) sẽ được hiểu là rmcờ ...
VasyaNovikov

1
EDIT: để làm điều đó an toàn, hãy sử dụngrm -rf ./* ./.*
VasyaNovikov

9

Để xóa tất cả các tệp thông thường theo cách đệ quy trong một thư mục, lệnh này (giả sử GNU hoặc FreeBSD find) là đủ tốt:

find . -type f -delete

Điều đó khiến tất cả các tệp không thông thường như symlink (cho dù chúng trỏ đến tệp thông thường hay không), thư mục, fifos, socket, thiết bị ...

Xem thêm:

find . ! -type d -delete

để xóa các tập tin thuộc bất kỳ loại nào ngoại trừ thư mục .


6

Hãy thử phiên bản này:

 rm -r test/*

1
Điều này sẽ không xóa các tệp ẩn (những tệp bắt đầu bằng ".").
gbmhunter

3

Tôi đang sử dụng findlệnh ở đây:

Bước 1: Tìm tất cả các tệp và xóa chúng:

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

Thí dụ:

find /home/user/Desktop/images/ -type f -exec rm {} \;

Bước 2: Tìm tất cả các thư mục con và xóa chúng:

find /path/to/directory/ -type d -exec rm -R {} \;

find /path/to/directory/ -type dbao gồm .như vậy sẽ xóa thư mục chính nó. Bạn cũng cần sử dụng công -mindepthtắc như những người khác đã nói.
Arthur Tacca

3

Câu hỏi là để trống một thư mục = xóa nội dung của một thư mục bao gồm các tệp ẩn, nhưng không phải chính thư mục đó. Lệnh find với -mindepth 1 thực sự là cách chính xác để đi, nhưng để tránh các thông báo lỗi, nó phải được nối với -maxdepth 1:

find /path/to/dir -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;

0

Cú pháp của rm là:

rm [OPTION]... FILE...

Vì vậy, bạn phải nêu rõ đường dẫn thích hợp, vd

rm -r sub_dir/

0

Bạn có thể xóa thư mục bằng lệnh sau:

sudo rm -r directoryname1/2/3/*

Nó sẽ bị xóa toàn bộ thư mục sau 3 / *.

Ví dụ sudo rm -r Tải xuống / bài hát / *

Nó sẽ bị xóa tất cả các tập tin trong Downloads/song.


0

Điều này hoạt động hoàn hảo đối với tôi, đã thử nghiệm một số biến thể làm việc mỗi lần.

Từ thư mục chứa thư mục hình ảnh.

rm -frd ./images/*

trước:

images/
    |_ header.png
    |_ footer.png
    |_ subdir/

sau:

images/

Không chắc chắn rằng nó đã được làm rõ trong câu hỏi ban đầu, nhưng chỉ để chỉ ra rằng trừ khi bạn kích hoạt dotglob, điều này sẽ bỏ qua bất kỳ "tập tin dấu chấm" hoặc thư mục dấu chấm nào dưới hình ảnh ( mkdir images/.somedir; touch images/.somefile)
Jeff Schaller

0

Để xóa tất cả các tệp và thư mục con trong thư mục hiện tại, bao gồm cả các tệp bị ẩn, không có thông báo lỗi :

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

Hoặc, từ thư mục mẹ:

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

Từ https://serverfault.com/a/47940/269538 .



-2

Xóa thư mục "kiểm tra" và tất cả các tệp bên trong:

 rm -r test

Xóa tất cả các tệp bên trong nhưng giữ thư mục "kiểm tra":

 rm -r test/*

-4

cd vào thư mục sau đó thực hiện lệnh sau:

ls |xargs rm -rf

2
Điều này sẽ thất bại trong tên tệp có chứa khoảng trắng. Tôi khuyên bạn không nên sử dụng đầu ra của ls làm đầu vào cho các lệnh khác, nó thường không an toàn.
dhag
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.