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?
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:
Hãy thử lệnh này:
find . -empty -type d -delete
Các find
lệ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 -empty
tù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 d
tùy chọn đúng đối với các tập tin kiểu được chỉ định; trong trường hợp này d
là viết tắt của các loại tập tin thư mục .
Các -delete
tù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.
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 -r
tùy chọn có nghĩa là xóa đệ quy, trong khi -f
phươ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ế -f
tùy chọn bằng -i
tùy chọn.
stdout
một lệnh (ví dụ find
) vào stdin
lệ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 man
trang 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ế.
Bạn có thể tận dụng sự rmdir
từ chối của lệnh để xóa các thư mục không trống và find -depth
tù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/null
vào để thực sự bỏ qua chúng.
Các -depth
tùy chọn để find
bắt đầu tìm kiếm ở dưới cùng của cây thư mục.
rm -rf
sẽ 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ứ.
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
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.)
$HOME
. Với một nụ cười ác độc.
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/
.
$ 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:
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, s
chứa danh sách các thư mục bên trong r
và f
sẽ chứa danh sách các tệp trong thư mục đó. Tất nhiên nếu f
và s
trống, chúng tôi biết đó r
là trống rỗng.empty
, danh sách tất cả các thư mục trống, dựa trên đánh giá đã nêu ở trên.map()
được sử dụng để thực hiện os.rmdir()
trên từng mục trong empty
danh 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)
/bin/sh
chỉ và Python thực sự là ngôn ngữ tao nhã hơn hai ngôn ngữ đó