การลบไดเร็กทอรี UNIX ด้วยเครื่องหมายขีดคั่นในชื่อ


13

ผ่านการซ้อมรบแบบเฮดเฮดในส่วนของฉันฉันบังเอิญสร้างไดเรกทอรีชื่อ (ตัวอย่าง) - และจบลงด้วยการเติมไฟล์

ฉันต้องการลบไดเรกทอรีดังกล่าว ฉันได้พยายาม:

rmdir -- -A

แต่มันก็บอกฉันว่าไดเรกทอรียังคงมีไฟล์อยู่ในนั้น และฉันไม่สามารถหาวิธี cd ในไดเรกทอรีเพื่อลบไฟล์ดังกล่าว

ฉันควรทำอย่างไรเพื่อกำจัดไดเรกทอรีที่มีปัญหานี้


5
โชคดีที่ไดเรกทอรีนั้นไม่มีชื่อว่า '-rf *'
user1686

เดียวกันในStackOverflowและยูนิกซ์
Dorian

คำตอบ:


29

ใช้ - กับทุกคำสั่ง

$ 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

คุณสามารถใส่. / ไว้หน้าไฟล์ - ด้วยวิธีนี้ rm หรือ rmdir จะไม่ทำงานเหมือนว่าชื่อไฟล์เป็นธงตัวเลือก

นอกจากนี้คุณยังสามารถออกตัวเลือก - ซึ่งบอกให้ rm ทำหน้าที่เหมือนทุกอย่างหลังจาก - เป็นชื่อไฟล์และไม่ควรประมวลผลตัวเลือกเพิ่มเติม อาจมีรุ่นเก่า ๆ ของ rm ที่ไม่เชื่อฟังแม้ว่าสวนสัตว์แห่งยูนิกซ์โบราณของฉันจะมีขนาดค่อนข้างเล็กในวันนี้ดังนั้นฉันจึงไม่สามารถบอกได้ว่ารุ่นใดหรือมีรุ่นที่ไม่เข้าใจ -

คุณควรติดนิสัย. / ต่อหน้าชื่อเมื่อคุณลบ แต่อย่างใด - คุณไม่มีทางรู้ว่ามีไฟล์ชื่อ -r หรือ -rf อยู่ในสารบบของคุณหรือไม่ คุณสามารถพูดได้ว่าคุณควรใช้ - แต่ฉันพบว่า. / มีความเป็นธรรมชาติมากกว่าเพราะมันชัดเจนว่า "ฉันต้องการลบไฟล์ในไดเรกทอรีนี้ไม่ใช่สิ่งที่เกิดขึ้นกับ glob"



2

rmdir จะไม่ลบไดเรกทอรีที่มีสิ่งใดอยู่ข้างใน "rm -rf" จะ rmdir ปลอดภัยกว่า "rm -rf" มาก คำตอบของ Moo น่าจะเป็นคำตอบที่ดีที่สุด



0

วิธีการที่แตกต่างกันคือการลบโดย inode (ใช้งานได้กับไฟล์ / ไดเรกทอรีที่มีตัวละครอื่น ๆ ที่ยากที่จะลบด้วย 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 จะยังคงผ่านอาร์กิวเมนต์ A บน commandline และจะพยายามตีความมันเป็นตัวเลือกดังนั้นคุณยังคงต้องป้องกันไม่ให้เห็นเส้นประนำอย่างใดอย่างหนึ่ง (ผ่านเครื่องหมายขีดคั่นคู่หรือโดยใส่. / ด้านหน้า ส่วนที่เหลือของชื่อ.
คริส

การค้นหาจะเติมหน้านั้นโดยอัตโนมัติเนื่องจากคุณกำลังค้นหาจาก '.' ชื่อไฟล์ที่ส่งผ่านจะเป็น './-A' หรือไฟล์ใด ๆ ที่อาจถูกเรียกใช้เติมด้วย.
baumgart

Nit: -execไม่หนีชื่อและไม่จำเป็นต้อง; อาร์กิวเมนต์ที่ส่งผ่านหนึ่งในexec*syscalls เป็นชื่อจริง มันเป็นเพียงอินพุตเชลล์ที่ต้องการตัวอักษรพิเศษเช่นเครื่องหมายอัฒภาคเว้นวรรคเครื่องหมายดอกจันเป็นต้นเพื่อให้เชลล์ส่งผ่านชื่อจริง (โดยไม่ต้องใส่เครื่องหมายอัญประกาศ) ที่กล่าวว่าfind -exec rm -f {}ใช้งานได้เฉพาะไฟล์ไม่ใช่ไดเรกทอรีตามที่ถามสำหรับคำถามนี้ find -exec rm -rf {}จัดการกับไดเรกทอรีและแม้กระทั่งไดเรกทอรีที่ไม่ได้รับอนุญาต แต่การข้ามfindและทำเพียงrm -rf ./-Aนั้นง่ายกว่ามาก
dave_thompson_085


-1

-pผมพยายามที่จะลบไดเรกทอรีชื่อ คำตอบของ @ Moo ประสบความสำเร็จในสิ่งที่ฉันไม่สามารถทำได้rm ./-pซึ่งสามารถใช้ได้อย่างกว้างขวางในหลาย ๆ หน้าเว็บหลังจากการค้นหาโดย Google

วิธีอื่นคือใช้หมายเลขไอโหนด ฉันใช้วิธีที่อธิบายไว้ที่นี่:

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

กล่าวโดยย่อให้ใช้คำสั่งต่อไปนี้:

  1. เพื่อแสดงไฟล์หรือหมายเลข inode ของไดเรกทอรี
ls -il
  1. ใช้findคำสั่งโดยใช้-exec rm -irfอาร์กิวเมนต์สำหรับไฟล์หรือ-exec rm -ifdrไดเรกทอรี
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

ตรวจสอบให้แน่ใจว่าคุณใช้การ-fตั้งค่าสถานะภายในมิฉะนั้น bash จะบ่นว่าไม่สามารถค้นหาไดเรกทอรีหรือไฟล์ได้

ทดสอบเมื่อ:

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

1
นี่เป็นคำตอบที่เกือบซ้ำซ้อนของคำตอบของ Baumgartt เมื่อ 10 ปีที่แล้ว แต่คุณไม่ต้องการrm -dและมักจะไม่-fเมื่อคุณเรียกใช้findแต่คุณต้องการ-rไดเรกทอรีและไม่จำเป็นต้องใช้ไฟล์ แม้เมื่อแก้ไขวิธีนี้ยังคงเงอะงะและต่ำกว่า สำหรับไดเรกทอรีที่ไม่ว่างให้ทำrm -fr ./-p- นั่นคือ r สำหรับไดเรกทอรีและ f ขึ้นอยู่กับการตั้งค่าการอนุญาต
dave_thompson_085

1
ทั้งสองวิธีได้ถูกกล่าวถึงแล้วในคำตอบก่อนหน้า
RalfFriedl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.