Xóa một tệp có tên bắt đầu bằng -
một Câu hỏi thường gặp, nhưng có vẻ như bạn đã gặp một vấn đề khác.
Trong số các giải pháp bạn đề cập trong câu hỏi:
rm -- -
Cần làm việc.
rm "-"
Điều đó không khác rm -
. Các trích dẫn được tước bởi shell và rm
lệnh chỉ xem dấu gạch nối đơn làm đối số. Dấu ngoặc kép rất hữu ích để thoát khỏi các siêu ký tự vỏ; dấu gạch nối là đặc biệt rm
, không phải vỏ.
rm "\-"
Dấu ngoặc kép thoát khỏi dấu gạch chéo ngược, vì vậy điều này cố gắng xóa một tệp có tên bao gồm hai ký tự, dấu gạch chéo ngược và dấu gạch nối.
rm \-
Điều này cũng giống như rm "-"
, tương đương với rm -
.
Khi điều đó xảy ra, ít nhất là với phiên bản GNU coreutils rm
, rm -
thực sự xóa (hoặc cố gắng xóa) một tệp có tên chỉ chứa một dấu gạch nối. Nếu tập tin của bạn có tên đó, nó sẽ biến mất ngay bây giờ. Tôi kết luận rằng tệp của bạn có một tên chỉ trông giống như một dấu gạch nối.
ls | cat -A
nên đưa ra một ý tưởng về những gì nó thực sự được gọi là.
Đây là một tập lệnh Perl tôi vừa ném vào nhau sẽ nhắc bạn cho từng tệp trong thư mục hiện tại và hỏi xem có nên xóa nó không. Được cung cấp mà không có bảo hành, nhưng tôi đã thử nghiệm nó một cách ngắn gọn.
#!/usr/bin/perl
use strict;
use warnings;
$| = 1;
opendir my $DIR, '.' or die ".: $!\n";
my @files = sort grep { -f $_ } readdir $DIR;
closedir $DIR;
foreach my $file (@files) {
print "Remove $file? ";
my $answer = scalar <>;
if ($answer =~ /^[Yy]/) {
unlink $file or warn "$file: $!\n";
}
elsif ($answer =~ /^[Qq]/) {
exit 0;
}
}
EDIT : Một giải pháp ít phức tạp hơn: nếu tên tệp chỉ là một ký tự, thì rm ?
nên xóa nó (cùng với bất kỳ tệp nào khác như vậy).