Làm cách nào để xóa tất cả các thư mục trống trong một thư mục khỏi dòng lệnh?


58

Nói rằng tôi có một thư mục có tên foo/. Thư mục này bao gồm các thư mục con. Làm thế nào tôi có thể xóa tất cả các thư mục trống trong một lệnh?

Câu trả lời:


119

Hãy thử lệnh này:

find . -empty -type d -delete

Các findlệnh được sử dụng để tìm kiếm cho các tập tin / thư mục phù hợp với một tiêu chí tìm kiếm cụ thể từ con đường quy định, trong trường hợp này thư mục hiện hành (vì thế .).

Các -emptytùy chọn đúng đối với bất kỳ tập tin và thư mục đó là trống rỗng.

Các -type dtùy chọn đúng đối với các tập tin kiểu được chỉ định; trong trường hợp này dlà viết tắt của các loại tập tin thư mục .

Các -deletetùy chọn là hành động để thực hiện, và đúng đối với tất cả các file tìm thấy trong tìm kiếm.


Tôi nghĩ rằng đây là cách dễ nhất để làm điều đó vì vậy tôi sẽ tiếp tục và đánh dấu điều này như đã trả lời.
ngay

Này Bill, tôi đã cố gắng đăng một câu hỏi tương tự khác và nó sẽ không cho tôi bởi vì nó nói đó là một bản dupe, vì vậy tôi hy vọng bạn có thể trả lời tôi ở đây. Nói rằng tôi muốn làm điều tương tự như trên nhưng loại bỏ tất cả các thư mục cho dù chúng có trống hay không.
justingrif

3
Cách bạn sẽ loại bỏ các thư mục, bất kể chúng có trống hay không, hãy gõ lệnh sau : rm -rf <directory-name>. Điều này sẽ xóa thư mục, cùng với tất cả nội dung của nó bao gồm các tệp và thư mục con. Các -rtùy chọn có nghĩa là xóa đệ quy, trong khi -fphương tiện lệnh không nhắc trước khi xóa. Tuy nhiên, nếu bạn muốn được nhắc trước khi xóa thư mục / tệp, hãy thay thế -ftùy chọn bằng -itùy chọn.
Hóa đơn

Điều gì nếu có một số tập tin trong thư mục nói tôi muốn giữ. Vì vậy, tôi muốn xóa tất cả các thư mục trong / foo / bar / nhưng giữ bất kỳ tệp nào có thể có trong đó.
justingrif

2
Có thể thực hiện việc này bằng cách sử dụng một đường ống để đưa stdoutmột lệnh (ví dụ find) vào stdinlệnh khác (ví dụ rm), tuy nhiên, hãy cẩn thận vì nó có thể xóa sạch hoặc xóa các tệp / thư mục mà bạn không muốn xóa bỏ! Để biết thêm thông tin về cách thực hiện việc này, hãy xem các mantrang cho mỗi lệnh này. Để an toàn, luôn luôn kiểm tra những thứ như vậy trong một thư mục tạm thời trước khi thử thực tế.
Hóa đơn

11

Bạn có thể tận dụng sự rmdirtừ chối của lệnh để xóa các thư mục không trống và find -depthtùy chọn để duyệt qua thư mục từ dưới lên:

find . -depth -exec rmdir {} \;  

(và bỏ qua các lỗi), hoặc thêm 2>/dev/nullvào để thực sự bỏ qua chúng.

Các -depthtùy chọn để findbắt đầu tìm kiếm ở dưới cùng của cây thư mục.

rm -rfsẽ xóa tất cả các tệp trong thư mục (và các thư mục con của nó và ....) VÀ tất cả các thư mục và mọi thứ.


8
rmdir *

Sẽ xóa tất cả các thư mục trống. Nó sẽ đưa ra một lỗi cho mọi thư mục và tệp không trống, để ngăn những lỗi đó làm lộn xộn thiết bị đầu cuối của bạn, hãy sử dụng

rmdir * 2> /dev/null

Điều này không phù hợp với kịch bản vì nó sẽ thoát với mã trạng thái khác không nhưng nó hoạt động.
the_drow

@the_drow làm thế nào để nó không phù hợp? Bằng cách này, bạn cũng có thể sử dụng rmdir * 2>/dev/null || true. (Cách tìm (1) tốt hơn cho kịch bản nhưng vì lý do khác: bởi vì nó thể hiện tốt hơn những gì bạn muốn làm.)
Alois Mahdal

Tôi thường làm điều này tại $HOME. Với một nụ cười ác độc.
Alois Mahdal

Bởi vì nó sẽ báo lỗi nếu một số thư mục không trống.
the_drow

cái này có nhanh hơn phương pháp find không? Có ai so sánh hai?
Xerus

1
find . -type d -empty -delete -maxdepth 1

Vì nếu bạn chỉ muốn xóa các thư mục con trực tiếp của foo/.


0

Cách tiếp cận Python

$ tree                                                                                                                                                                                  
.
├── empty_dir1
├── empty_dir2
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

Điều này hoạt động như vậy:

  • chúng tôi sử dụng os.walk()chức năng để đi bộ đệ quy cây thư mục. Trên mỗi lần lặp rđược đặt thành thư mục hiện tại mà chúng tôi đang truy cập, schứa danh sách các thư mục bên trong rfsẽ chứa danh sách các tệp trong thư mục đó. Tất nhiên nếu fstrống, chúng tôi biết đó rlà trống rỗng.
  • hiểu danh sách đầu tiên cho phép chúng tôi tạo empty, danh sách tất cả các thư mục trống, dựa trên đánh giá đã nêu ở trên.
  • chức năng thứ hai, map()được sử dụng để thực hiện os.rmdir()trên từng mục trong emptydanh sách. Danh sách hiểu có thể được sử dụng cũng như thay thế.

Như một kịch bản, điều này sẽ là như vậy:

#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
    if not f and not s and r != ".":
        empty.append(r)

for i in empty:
    os.rmdir(i)

quá phức tạp cho các câu hỏi đơn giản :(
Nurulhudamustaqim

@nurulhudamustaqim Phụ thuộc vào quan điểm. Đối với nhiều người dùng Linux đã quen với Python thì điều này thực sự rất khiêm tốn :) Và bên cạnh sự đa dạng của nó. Quản trị hệ thống hiện đại không giới hạn ở bash hoặc /bin/shchỉ và Python thực sự là ngôn ngữ tao nhã hơn hai ngôn ngữ đó
Sergiy Kolodyazhnyy
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.