2009-04-01 7 views
66

Tôi có một số tập tin trên máy Unix của tôi bắt đầu bằngLàm cách nào để xóa tệp bắt đầu bằng dấu nối kép?

-- 

ví dụ --testings.html

Nếu tôi cố gắng để xoá bỏ nó tôi nhận được lỗi sau:

cb0$ rm --testings.html 
rm: illegal option -- - 
usage: rm [-f | -i] [-dPRrvW] file ... 
     unlink file 

tôi đã cố gắng

rm "--testings.html" || rm '--testings.html' 

nhưng không hoạt động.

Làm cách nào để xóa các tệp như vậy trên thiết bị đầu cuối?

+0

Tương tự trên [serverfault] (https://serverfault.com/questions/47003/deleting-a-unix-directory-with-a-hyphen-in-the-name) và [unix] (https: // unix.stackexchange.com/questions/1519/how-do-i-delete-a-file-whose-name-begins-with-hyphen-aka-dash-or-minus). – Dorian

+1

@Dorian Vâng ok, nhưng tôi đã lần đầu tiên :) – cb0

Trả lời

140
rm -- --testings.html 

Tùy chọn -- nói rm để điều trị tất cả các đối hơn nữa như tên file, không phải là lựa chọn, ngay cả khi họ bắt đầu với -.

Điều này không cụ thể đối với lệnh rm. Hàm getopt triển khai thực hiện nó, và nhiều lệnh (tất cả?) Kiểu UNIX xử lý nó theo cùng một cách: -- chấm dứt xử lý tùy chọn, và bất cứ điều gì sau khi nó là đối số thông thường.

http://www.gnu.org/software/hello/manual/libc/Using-Getopt.html#Using-Getopt

+0

chính xác những gì tôi cần, cảm ơn – cb0

+4

Đây không phải là tiêu chuẩn trên tất cả các phiên bản của Unix, mặc dù nó hoạt động trên hầu hết. Xem câu trả lời của vatine cho một giải pháp thay thế hoạt động với tất cả các phiên bản. –

17

Hoặc rm -- --testings.html hoặc rm ./--testings.html.

1
rm ./--testings.html 

hoặc

rm -- --testings.html 
55
rm -- --somefile 

Trong khi làm việc, đó là một giải pháp dựa trên rm sử dụng getopts cho phân tích tùy chọn của nó. Có những ứng dụng trên mạng có khả năng phân tích cú pháp của riêng chúng và sẽ làm rối loạn điều đó (vì chúng có thể không nhất thiết phải triển khai "-- có nghĩa là kết thúc các tùy chọn" logic).

Do đó, các giải pháp bạn nên lái xe thông qua hộp sọ của bạn là một trong những điều này:

rm ./--somefile 

Nó sẽ luôn luôn làm việc, bởi vì cách này lập luận của bạn không bao giờ bắt đầu với một -.

Hơn nữa, nếu bạn đang cố tạo các kịch bản shell thực sự tốt; bạn nên đặt ./ vào trước tất cả các mở rộng tham số tên tệp để ngăn các tập lệnh của bạn bị hỏng do nhập tên tệp funky (hoặc để ngăn chúng bị lạm dụng/khai thác để làm những việc mà chúng không được phép thực hiện: ví dụ, rm sẽ xóa các tập tin nhưng bỏ qua các thư mục, trong khi rm -rf * sẽ xóa tất cả mọi thứ.Thông qua một tên tập tin "-rf" đến một kịch bản hoặc ai đó touch ~victim/-rf 'ing có thể theo cách này được sử dụng để thay đổi hành vi của nó với hậu quả thực sự xấu).

+2

+1 vì bạn nói đúng, nhưng việc viết kịch bản là một vấn đề hoàn toàn khác ngoài việc xử lý một tên tệp vụng về. Nếu câu hỏi là "làm cách nào để tôi xóa các tệp bắt đầu bằng dấu gạch nối hoặc chứa dấu cách,; <>, $ và các thư rác độc hại khác", thì nó sẽ cần câu trả lời đầy đủ :-) –

4

Một cách khác để làm điều đó là sử dụng tìm ...-name "- *" -delete

touch -- --file 
find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete 
3

Đối với một cách tiếp cận tổng quát hơn cho xóa các tập tin với các nhân vật không thể trong tên tập tin, một lựa chọn là sử dụng inode của tập tin.

Có thể lấy thông qua ls -i.

ví dụ:

$ ls -lai | grep -i test 
452998712 -rw-r--r-- 1 dim dim  6 2009-05-22 21:50 --testings.html 

Và để xóa nó, với sự giúp đỡ của find:

$ find ./ -inum 452998712 -exec rm \{\} \; 

Quá trình này có thể có lợi khi giao dịch với rất nhiều tác phẩm với đặc thù filename, vì nó có thể dễ dàng kịch bản.

+1

Chỉ hoạt động vì nó gọi 'rm' với đối số './-- testings.html'. Chỉ cần gõ trực tiếp 'rm ./-- testings.html' - cũng không cần phải duyệt toàn bộ cây thư mục. (Bạn có thể tránh cái sau bằng cách sử dụng '-maxdepth 1'.) –