it-swarm-vi.com

Làm cách nào để xóa một tệp có tên bắt đầu bằng "-" (gạch nối a.k.a. dash hoặc dấu trừ)?

Làm cách nào để xóa một tệp có tên tệp bắt đầu bằng dấu gạch ngang (dấu gạch nối hoặc dấu trừ) -? Tôi đang vào một máy chủ OSX từ xa và tôi có tệp này trong thư mục của mình:

tohru:~ $ ls -l
total 8
-rw-r--r--    1 me  staff  1352 Aug 18 14:33 --help
...

Làm thế nào trên thế giới tôi có thể xóa --help từ CLI? Vấn đề này là một cái gì đó mà tôi gặp trong các hình thức khác nhau, các tệp này rất dễ tạo ra, nhưng khó để thoát khỏi.

Tôi đã thử sử dụng dấu gạch chéo ngược

rm \-\-help

Tôi đã thử báo giá

rm "--help"

Làm cách nào để ngăn ký tự dấu trừ (dấu gạch ngang hoặc dấu gạch nối) được hiểu là một tùy chọn?

377
Bryan Rehbein

Sử dụng "-" để làm cho rm dừng phân tích các tùy chọn dòng lệnh, như thế này:

rm -- --help
559
Vegar Nilsen

Hoặc bạn có thể làm

rm ./--help
236
edfuh

Sử dụng find để làm điều đó:

find . -name '--help' -delete

Và đây là một phương pháp tốt bởi vì nếu bạn có nhiều hơn thì một vài tệp như thế này bạn có thể xóa, bạn có thể lấy danh sách xem trước các tệp bằng cách chạy find mà không cần -delete tùy chọn đầu tiên, và sau đó nếu danh sách các tệp trông ổn, chỉ cần chạy lại với -delete.

Trên thực tế, bạn tránh rm có lợi cho find (đặc biệt là trước khi xem trước) là một thói quen tốt sẽ giúp bạn tránh những sai lầm với rm * điều đó chắc chắn sẽ cắn bạn một ngày nào đó.

Tuy nhiên, lưu ý rằng tìm kiếm đó sẽ lặp lại qua tất cả các thư mục con của bạn, vì vậy bạn có thể muốn chạy nó với một ràng buộc độ sâu thư mục con như thế này:

find . -maxdepth 1 -name '--help' -delete

mà giới hạn tìm thấy trong thư mục hiện tại.

41
aculich

Câu trả lời của Vegar Nilsen và edfuh là rất tốt và là giải pháp thích hợp cho một vấn đề như thế này.

Tôi muốn thêm một câu trả lời chung cho câu hỏi này cho phép bạn xóa bất kỳ tệp nào có tên tệp khó. Đầu tiên số inode của nó được lấy bằng cách sử dụng ls -i hoặc một số dạng stat và sau đó tệp được xóa bằng cách tìm kiếm tệp trong thư mục hiện tại bằng số inode và thực hiện lệnh rm trên tệp có số inode phù hợp

find . -inode <inode> -exec rm {}\;

Vì số inode là duy nhất trong mỗi hệ thống tệp, bạn có thể xóa bất kỳ tệp nào bằng cách sử dụng tệp này; unicode hoặc sử dụng các ký tự thoát. Việc loại ra rất khó chịu vì vậy tôi khuyên bạn nên thêm dòng

TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards

vào của bạn .inputrc tập tin nếu bạn đang sử dụng bash. Điều này cho phép bạn chuyển qua danh sách các lần hoàn thành có thể ( để biết thêm thông tin ).

21
Baldur

Một giải pháp tàn bạo:

Perl -e "unlink '--help' or die 'Could not unlink.';"

Perl -e "rmdir '-d' or die 'Could not rmdir.';"
11
Thomas L Holaday

Linux Hướng dẫn tạo tệp có dấu gạch ngang và dấu cách, sau đó xóa tệp đó.

HÃY CẨN THẬN! Đừng vô tình chạy một rm -rf / hoặc lệnh xóa tầng tương tự.

Nếu tệp của bạn đang cố xóa bao gồm dấu hoa thị hoặc dấu gạch chéo, đừng vô tình bơm . hoặc là /* hoặc là * hoặc một số ký tự đại diện khác có thể xếp tầng xóa hệ điều hành của bạn.

Tạo một tệp có tên "--yo yo"

[email protected] ~ $ touch -- "--yo yo"
[email protected] ~ $ ls
bin  --yo yo

Đầu tiên, tìm nó với find :

[email protected] ~ $ find . -name "*--yo yo*"
./--yo yo

Đảm bảo lệnh find CHỈ tìm thấy MỘT tệp bạn muốn xóa:

Sau đó, vượt qua tùy chọn -delete để tìm, để xóa chúng :

[email protected] ~ $ find . -name "*--yo yo*" -delete
[email protected] ~ $ ls
bin  

Aaaannd nó đã biến mất.

8
Eric Leschinski

Midnight Commander (mc) là dễ nhất, chỉ cần chỉ vào nó và nhấn F8;)

2
Marcin

đây là một giải pháp mà tôi đã sử dụng trước khi tìm thấy chủ đề này.
[.__.] sử dụng thư mục vim để 'chỉnh sửa':

vim .

sau đó (trong vim) chọn tệp của bạn, nhấn del và xác nhận xóa.
[.__.] khi bạn hoàn thành việc thoát vim với :q

1
atti

Bạn đã thử thêm tên thư mục làm tiền tố:

$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste

Sử dụng thư mục làm tiền tố của tệp nói chung giúp tránh việc giải thích sai ký tự "trừ" làm tùy chọn lệnh của hàm phân tích cú pháp.