ไดเรกทอรีที่สร้างขึ้นโดยบังเอิญชื่อ“ ~” (ตัวหนอน)


47

ฉันจัดการเพื่อให้ไดเรกทอรีตัวอักษร~ชื่อ

(เห็นได้ชัดว่า Python os.mkdir('~/something')ทำเช่นนี้)

ฉันจะลบออกโดยไม่ทำให้บ้านของฉันไม่อยู่ได้อย่างไร

นอกจากนี้ถ้ามันช่วยได้ฉัน/homeมีพาร์ติชั่นแยกต่างหาก และซ้ำกัน~ตั้งอยู่ (คนจริง~ )


51
บังคับ XKCD ตกลงฉันอาจโกหกว่ามันเป็นภาระหน้าที่ และเป็น XKCD
Jesvin Jose

30
os.mkdir(os.path.expanduser('~/something'))ที่จะตอบคำถามหลามคุณไม่ได้ถามว่าในอนาคตการใช้งาน
Matt Nordhoff

8
... เพียงแค่อยากรู้อยากเห็นเนื่องจากคุณสร้างไดเรกทอรีในหลามคุณไม่คิดว่าจะทำos.rmdir('~/something')เพื่อลบมัน?
Bakuriu

@Bakuriu ในที่สุดผมไม่คิดออกว่า
UniversallyUniqueID

คำตอบ:


73

หนี~ด้วยหรือใช้ราคาเดียว\~ '~'คุณสามารถ

rmdir ~/\~

หรือ

cd ~ ; rmdir '~'

43
หากคุณกังวลเกี่ยวกับการลบสิ่งที่คุณไม่ควรทำก่อนอื่นคุณสามารถทำสิ่งที่ไม่ทำลายเช่น: mv '~' normalname จากนั้นลบไดเรกทอรี normalname
Chris Jefferson

53
rmdirไม่ทำลาย rmdirจะลบเฉพาะไดเรกทอรีที่ว่างเปล่าเท่านั้นดังนั้นหากคุณลองไปยังrmdirไดเรกทอรีที่มีสิ่งใดอยู่ในนั้นrmdirจะปฏิเสธที่จะลบมัน
Hitechcomputergeek

3
คุณไม่จำเป็นต้องหลบหนี tilde ในคำสั่งแรกของคำสั่งเหล่านี้ - ~ขยายเป็นพิเศษเฉพาะตอนต้นของคำว่า "word"
Henning Makholm

1
rmdir *คุณสามารถแม้เพียงแค่ เนื่องจากมันลบไดเรกทอรีที่ว่างเปล่าออกไปเท่านั้นคุณจึงไม่ต้องกังวลกับมันที่จะทำสิ่งใดทำลาย
Benubird

@ChrisJefferson: หากคุณต้องการตรวจสอบคำสั่งของคุณก่อนใช้ls -dเพื่อดูว่ามันมีรายชื่อไดเรกทอรีหรือไฟล์ที่คุณต้องการมัน mvไม่จำเป็นต้องให้อะไรกับผลกระทบเช่น
Peter Cordes

42

สิ่งที่หลามให้, หลามพาไป:

$ python -c 'import os; os.makedirs("~/foo")'; tree; python -c 'import os; os.removedirs("~/foo")'; tree
.
└── ~
    └── foo

2 directories, 0 files
.

0 directories, 0 files

หากคุณทำos.mkdirคุณสามารถยกเลิกได้ด้วยos.rmdir(และในทำนองเดียวกันสำหรับos.makedirsและos.removedirs)


36

คุณสามารถหลีกเลี่ยงชื่อไดเรกทอรีโดยใช้แบ็กสแลชเช่นนี้ (สมมติว่าคุณกำลังใช้งานในไดเรกทอรีหลักของชื่อที่คุณต้องการลบ):

rmdir \~

หรือคุณสามารถใช้เส้นทางสัมพัทธ์กับจุดเป็นไดเรกทอรีปัจจุบัน (เช่นเมื่ออยู่ในไดเรกทอรีหลัก):

rmdir ./~

หรือคุณสามารถใช้เส้นทางแบบเต็ม:

rmdir /home/USERNAME/~

และไม่ต้องกังวลrmdirสามารถลบไดเรกทอรีที่ว่างเปล่าได้เท่านั้น หากคุณพิมพ์คำสั่งผิดพลาดโดยไม่ตั้งใจและพา ธ จะประเมินไปยังโฮมไดเร็กตอรี่จริงของคุณ, มันจะไม่อันตรายเพราะมันมีไฟล์:

$ rmdir directory_with_files
rmdir: failed to remove ‘directory_with_files’: Directory not empty

ฉันชอบตัวเลือกเส้นทางสัมพัทธ์ มันควรจะเป็นไปไม่ได้ที่จะแมป./~ไป~/โดยไม่คำนึงถึงไดเรกทอรีที่คุณอยู่ในขณะ. สถานการณ์ที่คล้ายกันกับเส้นทางแน่นอนเต็ม
MBraedley

2

findคำสั่งสามารถทำปาฏิหาริย์ดังกล่าว คำสั่ง

ls -i

จะให้จำนวนไฟล์หรือไดเรกทอรี inode ของคุณ จากนั้นคุณสามารถใช้findเพื่อลบไฟล์หรือไดเรกทอรีดังกล่าวโดยใช้:

find . -inum <inode-number> -delete #for a file

และ

find . -inum <inode-number> -exec rm -rf {}\; #for directories

1

สิ่งที่ควรทำ

คุณควรจะได้ดำเนินการเป็นครั้งแรกแล้วhome=os.path.expanduser("~") จะถือว่าเป็นข้อความในหลามและไม่ขยายเหมือนมันจะอยู่ในหรือหอยอื่น ๆos.path.join(home,"something")~bash

$ python -c 'import os;home=os.path.expanduser("~"); os.mkdir(os.path.join(home,"something"))'                                                                                          

$ ls -ld ~/something
drwxrwxr-x 2 xieerqi xieerqi 4096 7月  12 21:00 /home/xieerqi/something/

วิธีกำจัดมัน

นอกเหนือจากวิธีการที่กล่าวถึงแล้วเราสามารถใช้ค่าฐานสิบหกสำหรับ~จากตารางอักขระ ASCII ซึ่งแตกต่างจากที่เกิดขึ้นจริง~ไม่ขยายไปยังไดเรกทอรีบ้านของผู้ใช้ในบรรทัดคำสั่ง (ในกรณีที่คุณสงสัยว่าเมื่อตัวหนอนปรากฏที่จุดเริ่มต้นของ คำจะขยายไปยังโฮมไดเร็กตอรี่ของผู้ใช้เปรียบเทียบls ~และls $'\x7e')

นี่คือวิธีการใช้งาน:

# Make the directory
$ mkdir ./~                                                                                                                                                                             
$ stat ./$'\x7e'                                                                                                                                                                        
  File: './~'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 801h/2049d  Inode: 5768019     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/ xieerqi)   Gid: ( 1000/ xieerqi)
Access: 2017-07-12 21:05:31.382828424 -0600
Modify: 2017-07-12 21:05:31.382828424 -0600
Change: 2017-07-12 21:05:31.382828424 -0600
 Birth: -

# and remove it 
$ rmdir ./$'\x7e'                                                                                                                                                                       
$ ls $'\x7e'
ls: cannot access '~': No such file or directory
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.