Xóa một thư mục UNIX có dấu gạch nối trong tên


13

Thông qua một thao tác xương đầu của tôi, tôi vô tình tạo ra một thư mục có tên (ví dụ) -A, và cuối cùng điền vào nó với các tập tin.

Tôi muốn xóa thư mục nói. Tôi đã thử:

rmdir -- -A

nhưng sau đó nó cho tôi biết rằng thư mục vẫn có tập tin trong đó. Và tôi không thể tìm ra cách cd vào thư mục để xóa các tập tin đã nói.

Tôi nên làm gì để thoát khỏi thư mục rắc rối này?


5
May mắn thay, thư mục không được đặt tên '-rf *'.
dùng1686

Tương tự trên stackoverflowunix .
Dorian

Câu trả lời:


29

Sử dụng - trên mỗi lệnh.

$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ mkdir -- -A
$ ls -la
total 36
drwxr-xr-x  2 richard  richard  512 Jul 28 15:44 -A
drwxr-xr-x  4 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ cd -- -A
$ ls
$ pwd
/home/richard/-A
$ cd ..
$ rm -rf -- -A
$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..

11

Bạn có thể đặt ./ trước tệp - theo cách đó rm hoặc rmdir sẽ không hoạt động như thể tên tệp là cờ tùy chọn.

Bạn cũng có thể đưa ra tùy chọn - yêu cầu rm hành động như thể mọi thứ sau - là tên tệp và nó không nên xử lý thêm tùy chọn nào nữa. Có thể có những phiên bản cũ hơn của rm không tuân theo điều đó, mặc dù sở thú cổ của tôi đã trở nên khá nhỏ trong những ngày này vì vậy tôi không thể nói cho bạn biết phiên bản nào hoặc nếu có phiên bản nào không hiểu -.

Bạn nên tập thói quen đặt ./ trước tên khi bạn xóa bằng mọi cách - bạn không bao giờ biết nếu có tệp -r hoặc -rf có tên trong thư mục của mình. Bạn có thể nói rằng bạn nên luôn luôn sử dụng - nhưng tôi thấy rằng ./ tự nhiên hơn vì nó nói rõ rằng "Tôi muốn xóa các tệp trong thư mục này, không phải bất cứ điều gì * xảy ra trên toàn cầu"


4

Đổi tên nó và sau đó xử lý nó bình thường:

$ mv -- -A foo
$ find foo
$ rm -rf foo

2

rmdir sẽ không xóa một thư mục với bất cứ thứ gì bên trong nó. "rm -rf" sẽ. rmdir an toàn hơn đáng kể so với "rm -rf". Câu trả lời của Moo có lẽ vẫn là tốt nhất.


1
rm -fr ./-A

Lệnh trên hoạt động với tôi.


0

Một phương pháp khác sẽ là xóa bằng inode (cách này hoạt động đối với các tệp / thư mục có các ký tự khác khó xóa chỉ bằng rm).

bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
5172770 make_hosts.pl
bash-3.2$ find . -inum 5172770 -exec rm -f {} \;
bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
bash-3.2$

rm vẫn sẽ được thông qua một đối số -A trên dòng lệnh và vẫn sẽ cố gắng diễn giải nó như một tùy chọn, vì vậy bạn vẫn cần ngăn nó nhìn thấy dấu gạch đầu dòng bằng cách nào đó (thông qua dấu gạch ngang kép hoặc bằng cách đặt ./ trước phần còn lại của tên.
chris

Phát hiện sẽ tự động trả trước, vì bạn đang tìm kiếm từ '.'. Tên tệp được truyền vào sẽ là './-A' hoặc bất kỳ tệp nào có thể được gọi, được đặt trước ./ và được thoát đúng cho lệnh.
baum hàm

Nit: -execkhông thoát khỏi tên, và không cần; đối số được chuyển qua một trong các tòa nhà exec*là tên thật. Nó chỉ là đầu vào shell cần các ký tự đặc biệt như dấu chấm phẩy không gian, v.v. được trích dẫn để lấy shell để vượt qua tên thực tế (KHÔNG CÓ trích dẫn). Điều đó nói rằng, find -exec rm -f {}chỉ hoạt động cho một tập tin, không phải là một thư mục như yêu cầu Q này; find -exec rm -rf {}không xử lý thư mục và thậm chí thư mục không trống, nhưng bỏ qua findvà chỉ làm rm -rf ./-Ađơn giản hơn nhiều.
dave_thndry_085

0

tìm có thể xóa thư mục theo cách này:

find . -type d -iname '-A' -delete

-1

Tôi đã cố gắng để xóa một thư mục có tên -p. Câu trả lời của @ Moo đã đạt được những gì tôi không thể làm được rm ./-p, nó có sẵn rộng rãi trên nhiều trang web sau khi tìm kiếm Google.

Một phương pháp khác là sử dụng số inode. Tôi đã sử dụng phương pháp được mô tả ở đây:

https://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

Tóm lại, sử dụng các lệnh sau:

  1. Để hiển thị số tập tin hoặc thư mục inode.
ls -il
  1. Sử dụng findlệnh bằng cách sử dụng -exec rm -irfđối số cho một tệp hoặc -exec rm -ifdrcho một thư mục.
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

Hãy chắc chắn rằng bạn sử dụng -fcờ bên trong, nếu không bash sẽ phàn nàn về việc không thể tìm thấy thư mục hoặc tệp.

Đã thử nghiệm trên:

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial

1
Điều này gần như trùng lặp với câu trả lời của baumgart từ 10 năm trước, nhưng bạn không cần rm -dbao giờ và thường không phải -fkhi gọi từ find, nhưng bạn cần -rmột thư mục và không cần nó cho một tập tin. Ngay cả khi sửa chữa phương pháp này vẫn vụng về và kém cỏi. Đối với một thư mục không trống, chỉ cần thực hiện rm -fr ./-p- đó là r cho một thư mục và f tùy thuộc vào cài đặt quyền.
dave_thndry_085

1
Cả hai phương pháp đã được đề cập trong các câu trả lời trước.
RalfFriedl
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.