Làm thế nào để xóa tất cả các tập tin và thư mục ẩn bằng Bash?


28

Giải pháp rõ ràng tạo ra mã thoát là 1:

bash$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
bash$ echo $?
1

Một giải pháp có thể sẽ bỏ qua dấu "." và thư mục ".." nhưng sẽ chỉ xóa các tệp có tên dài hơn 3 ký tự:

bash$ rm -f .??*

Vâng, nếu bạn không quá lo lắng về việc không thể loại bỏ. & .. vậy thì ai quan tâm? trừ khi bạn lo lắng về đầu ra xấu xí trong một kịch bản thì tôi nghĩ rằng giải pháp rõ ràng là ít gõ mà những người khác khá thẳng thắn.
Matt

Chỉ để bạn biết, .. và. không phải là tập tin. Chúng là tài liệu tham khảo cho các thư mục. . (chỉ một dấu chấm đơn) là thư mục hiện tại và .. (hai dấu chấm) là một liên kết đến thư mục tăng cấp. Ví dụ: nếu cd / home / user ,. bằng / home / user và .. is / home / Nói cách khác, bạn không thể xóa. và .. (.?)
phuzion

Cảm ơn vì bình luận Matt. Tôi thường sử dụng lệnh trong các tập lệnh với mỗi lần kiểm tra mã thoát lệnh (set -e). Trong những trường hợp này, một mã thoát chỉ định là cần thiết.
Yonatan Broza

Không có gì vốn có. và .. điều đó bảo vệ họ khỏi bị xóa bằng rm -rf. Đây chỉ là một cơ chế bảo vệ được thêm vào trong các biến thể hiện đại của rm.
kubanchot

Và luôn có rm -rf. * || đúng nếu bạn chỉ muốn thực hiện hành vi set -e cho một câu lệnh đó.
Domingo Ignacio Galdos

Câu trả lời:


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

Nên bắt tất cả các trường hợp. . ?? * sẽ chỉ khớp với hơn 3 tên tệp ký tự (như đã giải thích trong câu trả lời trước),. [^.] Sẽ bắt bất kỳ hai mục nhập ký tự nào (trừ ..).


Cảm ơn câu trả lời! Dựa vào đó, tôi cũng đã chuyển sang phiên bản ngắn hơn của "rm -rf. [^.] *".
Yonatan Broza

4
Hãy cẩn thận với phiên bản ngắn hơn, nó sẽ cho kết quả tương tự, nhưng không giống nhau. Nó sẽ không khớp tên với hai dấu chấm ở phía trước (ví dụ: "... /" đôi khi được nhìn thấy ẩn gốc, v.v.)
Russell Heilling

Và hãy cẩn thận để thực hiện kiểm tra PWD hoặc bạn mất tất cả các cài đặt của mình :)
kommradHomer

Điều này dường như không làm việc cho zsh. Bất kỳ đề xuất?
ryanjdillon 2/2/2016

Với zshtheo mặc định một trận đấu wildcard trống được coi là một lỗi; trong khi với bashnó chỉ đơn giản là thông qua không thay đổi. Để thực hiện zshhành vi giống như cách bạn có thể sử dụng lệnhunsetopt nomatch
Russell Heilling

1
find -path './.*' -delete

Điều này khớp với tất cả các tệp trong thư mục hiện tại bắt đầu bằng a .và xóa các đệ quy này. Các tập tin ẩn trong các thư mục không bị ẩn không được chạm vào.

Trong trường hợp bạn thực sự muốn xóa tất cả mọi thứ từ một thư mục, find -deletesẽ đủ.


Điều này sẽ xóa tất cả mọi thứ, không chỉ những mục bắt đầu bằng.
kasperd

Ồ, có vẻ như tôi đã đọc sai câu hỏi là "xóa mọi thứ kể cả các tập tin ẩn" ... Chà, thật tệ.
Fritz

@kasperd Cảm ơn, bây giờ nó thực sự nên trả lời câu hỏi.
Fritz

0

cách tốt nhất có lẽ là:

  • tìm thấy . -iname. * -maxdepth 1 -type f -exec rm {} \;

thay đổi rm thành ls -l nếu bạn chỉ muốn xem những gì sẽ bị xóa, để tiết lộ đầu ra u có thể muốn thêm tùy chọn -v vào rm

  • Tùy chọn -type f cho biết lệnh find chỉ tìm tệp (bỏ qua thư mục, liên kết, v.v.)
  • -maxdepth 1 nói rằng không tìm thấy các thư mục con

ps. đừng quên kết thúc '\;'


1
Cẩn thận! Bạn có nghĩa là -iname '. *' Hoặc -iname. * Nếu không bạn sẽ kéo vào. và .. dù sao đi nữa.
Domingo Ignacio Galdos

-1
ls -la | awk '$NF ~ /^\.[^.]+/  {print $NF}' | xargs rm -rf

ls -la ............. long list (all files and folders)
$NF ................ last field (file or folder name)
~   ................ Regular Expression match
/^\.[^.]+/ ......... dot followed by not dot at least once +

If the last field $NF match pattern show it and send 
it to xargs which will perform the task.

Điều này phá vỡ ngay lập tức bạn có một tệp có khoảng trắng trong tên của nó.
một CVn
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.