Tìm và xóa tất cả các thư mục có tên là Thử nghiệm kiểm tra trong linux


35

Tôi có nhiều thư mục có tên "test" và tôi muốn xóa chúng.

Tôi biết cách tìm và in chúng bằng cách sử dụng:

find . -name test -print

Bây giờ, làm thế nào để tôi loại bỏ các thư mục?


Xin lưu ý rằng tôi cũng có các tệp trong thư mục và chúng cũng phải được xóa.

Câu trả lời:


70

xargs làm tất cả các phép thuật:

find . -name test -type d -print0|xargs -0 rm -r --

xargs thực thi lệnh được truyền dưới dạng tham số, với các đối số được truyền cho stdin.

Điều này được sử dụng rm -rđể xóa thư mục và tất cả các con của nó.

Các --biểu thị sự kết thúc của lý lẽ, để tránh một con đường bắt đầu với -từ được coi là một cuộc tranh cãi.

-print0nói findđể in các \0ký tự thay vì dòng mới; và -0nói xargschỉ \0coi là dấu phân cách đối số.

Đây là cách gọi rmvới nhiều thư mục cùng một lúc, tránh việc gọi rmriêng cho từng thư mục.


Để thay thế, findcũng có thể chạy một lệnh cho mỗi tệp đã chọn :

find . -name test -type d -exec rm -r {} \;

Và cái này, với hiệu suất tốt hơn, vì nó sẽ gọi rmvới nhiều thư mục cùng một lúc :

find . -name test -type d -exec rm -r {} +

(Lưu ý +ở cuối; cái này tương đương với xargsgiải pháp.)


1
Câu trả lời tuyệt vời, đặc biệt là +trong tìm kiếm. Tôi không biết, chắc chắn ước gì tôi đã biết từ lâu.
Scott

coi chừng lệnh cuối cùng, bằng cách nào đó nó đã xóa một số tập tin. các xargslệnh làm việc tốt.
Henrique de Sousa

23
find /path/to/dir -name "test" -type d -delete
  • -name: tìm tên đã qua. Bạn có thể sử dụng -regexđể cung cấp tên dựa trên biểu thức thông thường

  • -type: tìm loại tập tin. dchỉ tìm thư mục

  • -delete: hành động xóa danh sách tìm thấy.

Cách khác:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

Như JF Sebastian đã nêu trong các ý kiến:

Bạn có thể sử dụng +thay vì \;để vượt qua nhiều thư mục cùng một lúc.


1
Xin lỗi, tôi quên đề cập rằng các thư mục này có thể có tập tin. Tôi không thể xóa một số trong số chúng vì lỗi "tìm: không thể xóa` ./start ': Thư mục không trống "
bộ sưu tập rác

@garbagecollection Tôi đã thêm một bản cập nhật.
jaypal singh

3
bạn có thể sử dụng +thay vì \;để vượt qua nhiều thư mục cùng một lúc.
jfs

Cảm ơn @JFSebastian Điểm tốt. Tôi sẽ thêm nó vào câu trả lời.
jaypal singh


5

Bạn cũng có thể sử dụng tùy chọn -exec

find . -name test -exec rm {} \;

3

Giả sử bash 4+

shopt -s globstar
rm -r ./**/test/

Dấu gạch chéo có nghĩa là nó sẽ chỉ khớp với các thư mục. Kiểm tra trước với:

printf '%s\n' ./**/test/

2

Giả sử bạn đang sử dụng gnu find , bạn có thể sử dụng tùy chọn -delete:

find . -name test -delete

cái nào dễ nhớ hơn


2

Như một câu trả lời khác chỉ ra, bạn có thể cố gắng tìm tất cả các thư mục có tên testvà xóa chúng

find -name "test" -type d -delete

Tôi gặp một số vấn đề với khả năng tương thích chéo trên Mac, vì vậy tôi đã sử dụng lệnh tương đương này:

find -path "*/test" -type d -delete
  • -path : tìm kiếm một mẫu trong tên tệp đủ điều kiện.

Tuy nhiên, trong cả hai trường hợp, nếu bất kỳ thư mục nào có tên testđều có tệp trong đó, findsẽ phàn nàn rằng Directory is not empty, và sẽ không xóa thư mục.

Nếu bạn định xóa tất cả các tệp bao gồm testthư mục, thì chúng ta có thể sử dụng cùng một mẹo để xóa tất cả các tệp trong các thư mục có tên testđầu tiên.

find -path "*/test/*" -delete

Mẫu : "*/test/*", sẽ đảm bảo chúng tôi chỉ xóa các tệp trong một thư mục có tên /test/. Khi các thư mục trống, chúng ta có thể tiếp tục và xóa các thư mục bằng lệnh đầu tiên:

find -path "*/test" -type d -delete

Thí dụ:

$ tree
.
├── mytest
│   └── test
│       └── blah.txt
├── test
│   ├── bar.jpg
│   └── dir
│       └── bar.bak
└── testdir
    └── baz.c

5 directories, 4 files

$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│   └── test
├── test
└── testdir
    └── baz.c

4 directories, 1 file

$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
    └── baz.c

2 directories, 1 file
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.