Lệnh xóa các tệp tạm thời kết thúc bằng ~


15

Nhiều ngày trước, tôi đã tìm thấy bí danh bash hữu ích này (nội dung của ~ / .bash_aliases )

# aliases

# finds temporary files ending with '~' and deletes them
alias rm~='find . -name '*~' -print0 | xargs -0 /bin/rm -f'

Bây giờ tôi đã thử sử dụng rm~sau cdmột số thư mục chứa 3 tệp kết thúc bằng~

Tôi đã gặp lỗi này trong thiết bị đầu cuối và các tệp không bị xóa

find: paths must precede expression: 1n.in~
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Ngoài ra khi tôi cố gắng rm~từ /home/međó, nó dường như không làm gì cả. Hoặc nó có thể mất rất nhiều thời gian.

Xin vui lòng cho tôi biết tại sao tôi nhận được lỗi, và làm thế nào để khắc phục nó.

Cảm ơn!

Câu trả lời:


26

Bí danh bash của bạn không được viết tốt (các trích dẫn đơn không được sử dụng tốt). Thay vào đó nên là:

alias rm~='find . -name "*~" -print0 | xargs -0 /bin/rm -f'

Bây giờ, cá nhân tôi không thích sử dụng các đường ống vô dụng và xargsvì vậy bí danh của bạn sẽ được viết tốt hơn là:

alias rm~='find . -name "*~" -type f -exec /bin/rm -fv -- {} +'

Các -type ftùy chọn để chỉ tìm thấy file (không phải thư mục, liên kết, vv), các -vtùy chọn để rmđể được tiết (in ra những gì nó xóa). Ở +cuối để findchạy rmvới tất cả các tệp được tìm thấy (chỉ sinh ra một thể hiện rm, thay vì một tệp cho mỗi tệp).

Bây giờ từ man bash:

Đối với hầu hết mọi mục đích, bí danh được thay thế bởi các hàm shell.

Thay vì bí danh, tốt hơn là sử dụng một hàm: bình luận bí danh của bạn trong .bash_aliasestệp (nghĩa là đặt một #dòng trước dòng đó) và trong tệp .bashrc, đặt hàm này (bất cứ nơi nào trong tệp, ở cuối tệp đều ổn) :

rm~() {
    find . -name "*~" -type f -exec /bin/rm -fv -- {} +
}

Ngoài ra, như câu trả lời khác đề cập, bạn có thể sử dụng -deletelệnh để tìm. Trong trường hợp này, rm~chức năng của bạn sẽ là:

rm~() {
    find . -name "*~" -type f -printf "Removing file %p\n" -delete
}

Trong thực tế, bạn có thể tạo một hàm tuyệt vời sẽ lấy một đối số, giả sử --dry-run, điều đó sẽ chỉ xuất ra những gì nó sẽ xóa:

rm~() {
    case "$1" in
    "--dry-run")
        find . -name "*~" -type f -printf "[dry-run] Removing file %p\n"
        ;;
    "")
        find . -name "*~" -type f -printf "Removing file %p\n" -delete
        ;;
    *)
        echo "Unsupported option \`$1'. Did you mean --dry-run?"
        ;;
    esac
}

Sau đó sử dụng như:

rm~ --dry-run

để chỉ hiển thị các tệp sẽ bị xóa (nhưng không xóa chúng) và sau đó

rm~

khi bạn hài lòng với điều này.

Thích nghi và mở rộng theo nhu cầu của bạn!

Ghi chú. Bạn sẽ phải mở một thiết bị đầu cuối mới để những thay đổi có hiệu lực.


Cảm ơn! Nó hoạt động độc đáo, và chạy khô là vô cùng hữu ích.
Vinayak Garg

2
find -type f -name '*~' -delete(vũ khí của sự lựa chọn, bên cạnh đó git clean -dfx .)
sehe

2
Đây là một giải pháp tao nhã, tôi đã phải đăng nhập chỉ để cung cấp cho bạn đạo cụ. +1 cho bạn, người bạn tốt của tôi!
CodeChimp

9

*~được mở rộng bởi shell trước khi nó được gán cho bí danh của bạn. Nhiệm vụ thực tế là:

alias rm~='find .name some~ file~ 1n.in~ -print0 | xargs -0 /bin/rm -f'

Tôi đề nghị sử dụng các hàm thay vì bí danh, đây là những hàm mạnh hơn và dễ xử lý hơn đối với dấu ngoặc kép.

Trong khi chúng ta đang ở đó, hãy loại bỏ phần thừa .(thư mục hiện tại được ngụ ý nếu không có tham số nào được đưa ra) và ngừng lạm dụng xargsvì một -deletetùy chọn đã tồn tại.

rm~() { find -name '*~' -ls -delete; }

Các -lstùy chọn không bắt buộc, nhưng thêm nó sẽ cho bạn thấy những file đã bị xóa.


+1 Cảm ơn! Nhưng tôi thêm chức năng này ở đâu?
Vinayak Garg

@VinayakGarg Bạn cũng có thể thêm nó vào .bash_aliases, nhưng tôi thường đặt chúng thẳng vào .bashrc.
Lekensteyn
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.