Làm thế nào để xóa ít hơn một tập tin có tên là - -?


17

Tôi vô tình tạo một tập tin với tên -(ví dụ, seq 10 > -). Sau đó, tôi đã cố gắng sử dụng lessđể xem nó, nhưng nó chỉ bị treo.

Tôi hiểu rằng điều này đang xảy ra vì less -mong đợi đầu vào từ đó stdin, vì vậy nó không diễn giải -dưới dạng tên tệp. Tôi đã thử less \-nhưng nó cũng không hoạt động.

Vì vậy, có cách nào để chỉ ra lessđó -là một tập tin và không phải stdin?

Điều tốt nhất tôi có thể nhận được là:

find -name '-' -exec less {} +

2
@muru cảm ơn vì nhận xét, nhưng bản sao có thể cụ thể đến mức tôi không nghĩ nó đủ điều kiện để trở thành "bản sao chính xác". Nếu nó được điều chỉnh lại thành một cái gì đó chung chung hơn như "cách truy cập tệp bắt đầu bằng '-'", có thể.
fedorqui

4
Đó không phải là một câu hỏi trùng lặp. Trường hợp cho -một mình là khác nhau. -không phải là một sự lựa chọn.
Stéphane Chazelas

1
@terdon Tôi không nghĩ rằng có cùng một câu trả lời trực tiếp có nghĩa là chúng là bản sao. Có một ví dụ ở đâu đó trong Meta SO: nếu một câu hỏi được trả lời bằng "Không", liệu bất cứ điều gì có câu trả lời đúng là "Không" sẽ là một bản sao? Như tôi đã nói trước đây, sẽ rất thú vị khi sắp xếp lại ứng cử viên trùng lặp để nó chung chung hơn; mặt khác, không có ý nghĩa gì khi gửi đến đó những câu hỏi khác như câu hỏi này.
fedorqui

4
@terdon, không. Các giải pháp được chấp nhận sẽ không làm việc ở đây. Và không, -không được coi là một lựa chọn, đó là một vấn đề hoàn toàn khác với trường hợp các đối số xảy ra có hình dạng như các tùy chọn.
Stéphane Chazelas

2
Không cần thiết phải đặt -giữa các dấu ngoặc đơn giống như '-'hoặc thoát nó như thế \-bởi vì đó -không phải là một ký tự đặc biệt cho các shell thông thường (ít nhất là các shell tuân thủ POSIX). Kết quả là như nhau.
pabouk

Câu trả lời:


53

Chỉ cần tiền tố với ./:

less ./-

Hoặc sử dụng chuyển hướng:

less < -

Lưu ý rằng vì -(trái ngược với -xhoặc --foo--ví dụ) được coi là tên tệp đặc biệt thay vì tùy chọn, nên sau đây không hoạt động:

less -- -   # THIS DOES NOT WORK

3
BTW, đó là những gì find -name '-' -exec less {} +chạy.
Stéphane Chazelas

6
@fedorqui, không nó chỉ là -./-(hoặc /path/to/-hay ../to/-) là hai (4) đường dẫn hợp lệ để mà -tập tin, nhưng một -đối số là đặc biệt để less(có nghĩa là đọc từ stdin) trong khi ./-không phải là đặc biệt.
Stéphane Chazelas

2
@fedorqui find -name '-' -exec less {} +là hình thức không chuẩn cho find . -name '-' -exec less {} +. Nó hạ cây xuống .và tìm các tệp và chuyển các đường dẫn của các tệp đó làm đối số less. Thay thế -exec lessbằng -exec echo lessđể xem những gì đang được chạy.
Stéphane Chazelas

4
@haylem, --là đánh dấu sự kết thúc của các tùy chọn. Nó sẽ không giúp đỡ ở đây. Đó -không phải là một lựa chọn, đó là một đối số không phải tùy chọn đặc biệt. Xem thêm unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756
Stéphane Chazelas

3
@haylem, hãy thử nó cho chính mình. --được xử lý bởi getopt () để đánh dấu sự kết thúc của các tùy chọn, -không được nhận ra là một tùy chọn bởi getopt (), do đó -sẽ được công nhận là một đối số bình thường cho dù --được cung cấp hay không. Và như một đối số bình thường, lessgiống như hầu hết các tiện ích văn bản sẽ coi nó là ý nghĩa stdin, điều mà chúng ta không muốn ở đây.
Stéphane Chazelas

3

Tôi sẽ chỉ mv - f && less f. Vấn đề được giải quyết.


Chà, điều này hoạt động, mặc dù nó gợi cho tôi nhớ về hàng triệu triệu đô la của NASA để phát triển một cây bút sẽ viết trong không gian, trong khi các phi hành gia Liên Xô đã sử dụng bút chì . Tôi nghĩ rằng chúng ta có thể đủ khả năng đầu tư một chút vào nghiên cứu ở đây.
fedorqui

+1 tại sao làm phức tạp mọi thứ nếu một giải pháp đơn giản tồn tại.
Mhmd

3

Lưu ý: câu trả lời của tôi KHÔNG hợp lệ trong trường hợp của OP và chỉ áp dụng cho các công cụ theo quy ước được đề cập dưới đây và không phải trong trường hợp tệp có tên chính xác -(dấu gạch ngang), thường là trường hợp đặc biệt để xác định rằng đọc từ tiêu chuẩn đầu vào dự kiến. Xem câu trả lời được chấp nhận.

Để lại đây vì nó chứa thông tin hữu ích cho các trường hợp khác mà người ta có thể vấp ngã trong khi tìm kiếm câu trả lời.


Double-Dash đó!

Sử dụng --quy ước double-dash ( ) tiêu chuẩn để chỉ ra đối số cuối cùng:

less -- -FILENAME

Thí dụ

$ echo "meh" > -badname
$ less -badname
Number is required after -b
$ less -- -badname # GREAT SUCCESS!

Ai vậy?

--Đối số này xuất phát từ một quy ước được hỗ trợ bởi hầu hết các triển khai tiện ích shell và công cụ dòng lệnh, và hầu hết các shell sẽ ủng hộ rõ ràng rằng bạn nên tuân theo nó khi triển khai các công cụ CLI.

Được giới thiệu bởi Nhóm Mở

Opengroup cũng đề cập đến nó trong phần Mặc định mô tả tiện ích (v6) của Đặc tả cơ sở:

Hành vi mặc định: [...] Các tiện ích tiêu chuẩn không chấp nhận các tùy chọn, nhưng chấp nhận toán hạng, sẽ nhận ra "-" là đối số đầu tiên bị loại bỏ.

Yêu cầu để nhận ra "-" là bởi vì các ứng dụng tuân thủ cần một cách để bảo vệ toán hạng của chúng khỏi mọi tùy chọn tùy ý mà việc triển khai có thể cung cấp như một phần mở rộng. Ví dụ: nếu foo tiện ích tiêu chuẩn được liệt kê là không có tùy chọn và ứng dụng cần thiết để đặt cho nó một tên đường dẫn có dấu gạch nối hàng đầu, thì nó có thể thực hiện một cách an toàn như sau:

foo -- -myfile

và tránh mọi vấn đề với -m được sử dụng như một phần mở rộng.

Và trong Nguyên tắc Cú pháp Tiện ích (v7):

Hướng dẫn 10: Đối số đầu tiên không phải là đối số tùy chọn nên được chấp nhận làm dấu phân cách chỉ ra kết thúc của các tùy chọn. Bất kỳ đối số nào sau đây phải được coi là toán hạng, ngay cả khi chúng bắt đầu bằng ký tự '-'.

Được đề xuất bởi Bash

Ở đây, trích từ hướng dẫn bash, về các nội dung hỗ trợ của nó:

Trừ khi có ghi chú khác, mỗi lệnh dựng sẵn được ghi lại trong phần này dưới dạng chấp nhận các tùy chọn đi trước - chấp nhận - để biểu thị sự kết thúc của các tùy chọn.

Các nội dung:, đúng, sai và thử nghiệm không chấp nhận các tùy chọn và không xử lý - đặc biệt. Lối ra, đăng xuất, phá vỡ, tiếp tục, cho phép và thay đổi các nội dung chấp nhận và xử lý các đối số bắt đầu bằng - mà không yêu cầu -. Các nội dung khác chấp nhận các đối số nhưng không được chỉ định là chấp nhận các tùy chọn diễn giải các đối số bắt đầu bằng - như các tùy chọn không hợp lệ và yêu cầu - để ngăn chặn việc giải thích này.

Lưu ý rằng echo không diễn giải - có nghĩa là kết thúc các tùy chọn.

Đọc thêm


2
+1: Hầu hết các giải pháp di động và không phụ thuộc vào lệnh, dễ nhớ và được coi là "cách thực hành tốt nhất"
mveroone

2
@Kwaio có tài liệu tham khảo nào về "thực hành tốt nhất" không? Chỉ cảm thấy tò mò về nó.
fedorqui

24
Câu trả lời đó áp dụng cho các đối số trông giống như các tùy chọn. Đây không phải là trường hợp -không phải là một lựa chọn. Sử dụng ./-hoặc chuyển hướng khi có thể nói chung là một cách tiếp cận tốt hơn vì nó tránh được các loại của các vấn đề như foo=barcủa awkhay -. Xem thêm unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756
Stéphane Chazelas

7
Như Stéphane nói, này không trả lời các câu hỏi. less -- -vẫn sẽ cố gắng đọc từ stdin.
Michał Politowski

5
Bạn có thể muốn xóa câu trả lời (hoặc chuyển câu hỏi sang câu hỏi khác vì có tài liệu tham khảo hữu ích ở đây) hoặc làm rõ rằng nó không áp dụng cho trường hợp cụ thể này (và có thể giải thích lý do tại sao sẽ hữu ích hơn).
Stéphane Chazelas
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.