Làm cách nào để xóa an toàn tất cả các tệp có phần mở rộng cụ thể (ví dụ .bak
) khỏi thư mục hiện tại và tất cả các thư mục con bằng một dòng lệnh? Đơn giản, tôi sợ sử dụng rm
vì tôi đã sử dụng sai một lần và bây giờ tôi cần lời khuyên.
Làm cách nào để xóa an toàn tất cả các tệp có phần mở rộng cụ thể (ví dụ .bak
) khỏi thư mục hiện tại và tất cả các thư mục con bằng một dòng lệnh? Đơn giản, tôi sợ sử dụng rm
vì tôi đã sử dụng sai một lần và bây giờ tôi cần lời khuyên.
Câu trả lời:
Bạn thậm chí không cần sử dụng rm
trong trường hợp này nếu bạn sợ. Sử dụng find
:
find . -name "*.bak" -type f -delete
Nhưng sử dụng nó với sự đề phòng. Chạy trước:
find . -name "*.bak" -type f
để xem chính xác những tập tin bạn sẽ loại bỏ.
Ngoài ra, hãy chắc chắn rằng đó -delete
là đối số cuối cùng trong lệnh của bạn. Nếu bạn đặt nó trước -name *.bak argument
, nó sẽ xóa mọi thứ .
Xem man find
và man rm
để biết thêm thông tin và cũng xem câu hỏi liên quan này trên SE:
rm *.bak
sẽ không làm việc cho các thư mục con.
rm *.bak
sẽ chỉ xóa tất cả các tệp kết thúc bằng .bak trong thư mục hiện tại. TO cũng thực hiện mọi thứ trong các thư mục con mà bạn cần để sử dụng các khối, sử dụng tùy chọn -r hoặc sử dụng ví dụ find.
rm -r *.bak
! Nó cũng loại bỏ các thư mục kết thúc .bak
bằng tất cả nội dung của chúng.
-delete
là đối số cuối cùng trong lệnh của bạn. Nếu bạn đặt nó trước -name *.bak
đối số, nó sẽ xóa mọi thứ.
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
-delete
cờ của find
. Thông tin thêm có thể được tìm thấy trong mục hướng dẫn sử dụng GNU để xóa các tệp có find .
Đầu tiên chạy lệnh shopt -s globstar
. Bạn có thể chạy nó trên dòng lệnh và nó sẽ chỉ có hiệu lực trong cửa sổ shell đó. Bạn có thể đặt nó vào trong .bashrc
, và sau đó tất cả các vỏ mới bắt đầu sẽ nhặt nó lên. Tác dụng của lệnh đó là tạo **/
các tệp trùng khớp trong thư mục hiện tại và các thư mục con của nó theo cách đệ quy (theo mặc định, **/
có nghĩa tương tự như */
: chỉ trong các thư mục con ngay lập tức). Sau đó:
rm **/*.bak
(hoặc gvfs-trash **/*.bak
hoặc những gì có bạn).
Xóa các tập tin là đối với tôi không phải là một cái gì đó bạn nên sử dụng rm
cho. Đây là một thay thế:
sudo apt-get install gvfs # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash" # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak # trash the files (thus moving them to the trash bin)
Như Flimm nói trong các ý kiến:
Gói
trash-cli
này thực hiện tương tự nhưgvfs-trash
không có sự phụ thuộc vào gvfs.
Vì thế:
sudo apt-get install trash-cli
Bạn không cần tạo bí danh cho việc này, vì trash-cli
gói cung cấp một lệnh trash
, thực hiện những gì chúng ta muốn.
Vì Eliah Kagan nói rõ trong các bình luận rộng rãi, bạn cũng có thể thực hiện đệ quy này bằng cách sử dụng find
. Trong trường hợp đó, bạn không thể sử dụng bí danh, vì vậy các lệnh bên dưới giả sử bạn đã cài đặt trash-cli
. Tôi tóm tắt ý kiến của Eliah:
Lệnh này tìm và hiển thị tất cả .bak
các tệp và liên kết tượng trưng ở bất cứ đâu trong thư mục hiện tại hoặc thư mục con của nó hoặc bên dưới.
find . -name '*.bak' -xtype f
Để xóa chúng, thêm một -exec
bằng trash
lệnh:
find . -name '*.bak' -xtype f -exec trash {} +
-xtype f
chọn tập tin và liên kết tượng trưng đến tập tin, nhưng không chọn thư mục. Để xóa các thư mục .bak, hãy xóa phần đó và sử dụng -execdir
để tránh cannot trash non-existent
lỗi cho .bak
các tệp trong .bak
thư mục:
find . -name '*.bak' -execdir trash {} +
rm
để xóa mọi thứ" là một tuyên bố gây tranh cãi nhưng tôi phải đồng ý rằng việc sử dụng thứ gì đó sẽ cho phép bạn hoàn tác mọi thứ sẽ khôn ngoan hơn.
trash-cli
làm điều tương tự như gvfs-trash
không có sự phụ thuộc vào gvfs
.
find . -name "*.bak" -type f
hiển thị những gì trash *.bak
xóa. Đó thực sự là những gì bạn có ý nghĩa? Bạn có thể di chuyển các thư mục vào thùng rác bằng trash
hoặc gvfs-trash
, nhưng trash *.bak
sẽ chỉ di chuyển các tệp và thư mục có tên kết thúc .bak
và nằm ngay trong thư mục hiện tại. Shell mở rộng *.bak
, do đó trash *.bak
sẽ không ảnh hưởng đến .bak
các tệp trong thư mục con không được đặt tên .bak
.
ls *.bak
(mà tôi nghĩ bạn muốn nói) liệt kê những gì trash *.bak
rác. find . -name '*.bak' -xtype f -exec trash {} +
rác tất cả .bak
các tập tin bất cứ nơi nào dưới .
. Nó không thể sử dụng bí danh, vì vậy hãy cài đặt trash-cli
hoặc viết gvfs-trash
thay thế. Đây là một ví dụ. -xtype f
chọn tập tin và liên kết tượng trưng đến tập tin, nhưng không chọn thư mục. Để xóa .bak
các thư mục quá, sử dụng find . -name '*.bak' -execdir trash {} +
, tránh cannot trash non existent
lỗi cho .bak
các tệp trong .bak
thư mục. Xin vui lòng sử dụng bất kỳ điều này trong câu trả lời của bạn.
Nếu bạn muốn xóa tất cả các tệp thuộc một loại nhất định, nhưng chỉ có 1 thư mục "sâu" khỏi thư mục hiện tại:
find . -maxdepth 2 -name "*.log" -type f -delete
-maxdepth 2 vì thư mục hiện tại " . " được tính là thư mục đầu tiên.
Xóa tất cả các tệp có tên hoặc hậu tố được xem xét đệ quy:
find . -name '*.pyc' -type f -delete
Xóa tất cả các thư mục với tên được xem xét đệ quy:
find ~ -path '*/__pycache__/*' -delete
find ~ -type d -name '__pycache__' -empty -delete
Một số ít được kiểm soát chặt chẽ, nhưng trong một dòng duy nhất:
find ~ -path '*/__pycache__*' -delete
[ LƯU Ý ]:
d
là tùy chọn thư mục và f
là tùy chọn tập tin.
Nếu bạn đang ở trong một repo git, bạn có thể sử dụng:
git clean -fdx
Điều này xóa các tệp và tệp không bị theo dõi trong .gitignore.
rm *.bak
như thế nào?