ลบ symlink ไปยังไดเรกทอรี


1085

ฉันมี symlink ไปยังไดเรกทอรีที่สำคัญ ฉันต้องการกำจัด symlink นั้นในขณะที่เก็บไดเรกทอรีไว้ด้านหลัง

ฉันพยายามและได้รับกลับมาrm ฉันพยายามและได้กลับมา จากนั้นผมก็เดินหน้า, และrm: cannot remove 'foo'
rmdirrmdir: failed to remove 'foo': Directory not empty
rm -frm -rfsudo rm -rf

จากนั้นฉันไปหาข้อมูลสำรอง

มีวิธีกำจัด symlink โดยไม่ทิ้งทารกด้วยการอาบน้ำหรือไม่?


74
เกิดอะไรขึ้นกับการถามคำถามที่เกี่ยวข้องกับ linux ครั้งสุดท้ายที่ฉันตรวจสอบการล้นสแต็คไม่ใช่เฉพาะระบบปฏิบัติการ
Jeremy Cantrell

6
คำถามนี้จะไม่เหมาะกับ Super User หรือ Stack ที่เกี่ยวข้องกับ Linux หรือไม่
mwfearnley

45
@mwfearnley คงเป็น แต่ตรวจสอบวันที่ ผู้ใช้ขั้นสูงยังไม่ได้เป็นอย่างนั้น มันถูกย้ายแล้วดังนั้นก็มีเช่นกัน ไม่แน่ใจว่าทำไมยังอยู่ที่นี่ แต่เป็นคำถามให้คะแนนสูงสุดของฉันและฉันจะไม่ดูกรรมของขวัญในปาก
Matthew Scouten

16
เคล็ดลับ: rm -r link/ลบเนื้อหาในเป้าหมาย
Gayan Weerakutti

31
Then I went to find my back-ups- นั่นทำให้ฉันหัวเราะหึๆ
frakman1

คำตอบ:


1308
# this works:
rm foo
# versus this, which doesn't:
rm foo/

โดยทั่วไปคุณต้องบอกให้ลบไฟล์ไม่ลบไดเรกทอรี ฉันเชื่อว่าความแตกต่างระหว่างrmและrmdirมีอยู่เนื่องจากความแตกต่างในวิธีที่ C ไลบรารีปฏิบัติต่อกัน

ไม่ว่าจะในกรณีใดก็ตามสิ่งแรกควรใช้งานได้ในขณะที่อันดับที่สองควรบ่นเกี่ยวกับการเป็นไดเรกทอรี

ถ้ามันไม่ทำงานตามข้างต้นให้ตรวจสอบการอนุญาตของคุณ คุณต้องมีสิทธิ์เขียนในไดเรกทอรีที่มีเพื่อลบไฟล์


121
อ่าใช่ ที่เหมาะสม ฉันไม่เคยพิมพ์ฟูฉันพิมพ์ f <tab> และทุบตีด้วย / สำหรับฉัน
Matthew Scouten

6
สิ่งนี้ไม่ได้ผลเสมอไป ในบางครั้งคุณจำเป็นต้องเรียกใช้rm -rf folderName(โดยไม่มีการต่อท้าย /) เพื่อลบ symlink Amazon Linux ทำงานด้วยวิธีนี้ภายใต้สถานการณ์บางอย่างตัวอย่างเช่น
brandonscript

18
@ r3mus: อย่าใช้-rกับ symlink หากคุณไม่ต้องการสูญเสียทุกสิ่งทุกอย่างที่อยู่ภายใน -fไม่ควรจำเป็นอย่างใดอย่างหนึ่งยกเว้นอาจจะแทนที่การอนุญาตไฟล์
Matthew Scharley

27
โดยเฉพาะunlinkไม่มีความสัมพันธ์กับการดำเนินการของlnAKA 'ลิงก์' ชื่อunlinkอ้างถึงกระบวนการยกเลิกการเชื่อมโยง / ลบไฟล์ออกจากตารางไฟล์ของระบบไฟล์เพื่อให้เนื้อหาถูกแยกออกจากการอ้างอิงถึงพวกเขา - พวกเขาจะถูกยกเลิกการเชื่อมโยง มันเป็นชื่อที่สับสนที่ทำให้เข้าใจผิดอย่างจริงจังเมื่อใช้กับลิงก์และลิงก์สัญลักษณ์โดยเฉพาะ unlinkจะทำงานร่วมกับ symlink เพราะมันทำงานกับไฟล์ใด ๆโดยไม่คำนึงถึงประเภท
Matthew Scharley

4
หากคุณเคยกังวลเกี่ยวกับการทำสิ่งที่โง่เง่าจริง ๆ คุณสามารถalias rm="rm -i"ซ่อนหนังได้มากกว่าที่ฉันคิดไว้
Matthew Scharley

832

ใช้คำสั่ง "unlink" และตรวจสอบให้แน่ใจว่าไม่มี / ที่ท้าย

$ unlink mySymLink

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

ฉันคิดว่านี่อาจเป็นปัญหาได้ถ้าฉันอ่านมันอย่างถูกต้อง

หากชื่อที่อ้างถึงลิงก์สัญลักษณ์ลิงก์นั้นถูกลบออก

หากชื่อที่อ้างถึงซ็อกเก็ต Fifo หรืออุปกรณ์ชื่อนั้นจะถูกลบออก แต่กระบวนการที่มีวัตถุเปิดอาจใช้งานต่อไป

https://linux.die.net/man/2/unlink


33
@OmarAbid เวอร์ชั่น "rm foo /" ทำให้ฉันกลัว หนึ่งนี้ดูเหมือนว่าจำนวนมากที่ปลอดภัย :)
โจฟิลลิป

9
ใน Ubuntu ผมทดสอบด้วย~/c/a/file, มี/c/b/ ln -s ~/c/a ~/c/b/ใน~/c/b/, rm a/ไม่ได้ทำงานเพียงเทเดิมrm -rf a/ ทำงานได้อย่างสมบูรณ์แบบและไม่ทำอะไรเลย aunlink aunlink a/
Brady Trainor

3
ใน OS X 10.10, เป็นเพียงนามแฝงสำหรับunlink rmไปเพื่อแสดงว่ามีการใช้rmระเบียบวินัยที่เหมาะสมเมื่อจัดการกับส่วนใดส่วนหนึ่งของโครงสร้างไดเรกทอรีของคุณ
Doug Powers

1
ในการเขียนสคริปต์rm -fจะลบลิงค์อย่างเงียบ ๆ ไม่ว่าจะมีอยู่หรือไม่ในขณะที่unlinkจะบ่นหากไม่มีลิงค์อยู่ ไม่มีตัวเลือก `-f 'ที่เทียบเท่ากับการยกเลิกการเชื่อมโยงทำให้สคริปต์ซับซ้อนยิ่งขึ้น
ผู้ใช้ shonky linux

22
unlinkสามารถลบไฟล์ปกติ มันมีคุณสมบัติน้อยกว่าrmและไม่เฉพาะเจาะจงกับ symlinks rmไม่ลบไดเรกทอรีที่ไม่มี-rแฟล็กเช่นกัน ดังนั้นฉันขอแนะนำให้เลือก rm แต่ก็มีธงสำหรับ verbose และแบบโต้ตอบ; เช่นเดียวกับคำเตือนที่มีความหมายและข้อความผิดพลาด
ThorSummoner

18

rm ควรลบลิงค์สัญลักษณ์

skrall@skrall-desktop:~$ mkdir bar
skrall@skrall-desktop:~$ ln -s bar foo
skrall@skrall-desktop:~$ ls -l foo
lrwxrwxrwx 1 skrall skrall 3 2008-10-16 16:22 foo -> bar
skrall@skrall-desktop:~$ rm foo
skrall@skrall-desktop:~$ ls -l foo
ls: cannot access foo: No such file or directory
skrall@skrall-desktop:~$ ls -l bar
total 0
skrall@skrall-desktop:~$ 

17

ใช้rm symlinknameแต่ไม่รวมถึงการทับที่สิ้นสุด (ไม่ได้ใช้: rm symlinkname/) จากนั้นคุณจะถูกถามว่าคุณต้องการลบ symlink หรือไม่yเพื่อตอบว่าใช่


63
คุณไม่ผิด แต่คำตอบที่ถูกต้องอยู่ที่นี่แล้วและยอมรับ (4 ปีที่แล้ว!) ทำไมต้องรำคาญ
Matthew Scouten

1
Google มีสิ่งนี้เป็นตัวอย่างข้อมูลสำคัญเมื่อค้นหา "ลบ symlink" บางทีมันอาจจะชอบความกะทัดรัดของมัน แต่ก็ไม่แน่ใจว่าฮิวริสติกทำงานอย่างไร อย่างไรก็ตามผมได้ทันที facepalm เมื่อผมมองย้อนกลับไปที่บรรทัดคำสั่งของฉัน :-)
แรนดัล

12

สมมติว่ามันคือ symlink

$ rm -d symlink

ควรจะเข้าใจ แต่เนื่องจากเราไม่สามารถเปิดใช้งานรหัสแฝงที่มีไว้สำหรับกรณีอื่นที่ไม่มีอยู่อีกต่อไป แต่เกิดขึ้นเพื่อทำสิ่งที่ถูกต้องที่นี่


7

หาก rm ไม่สามารถลบ symlink ได้คุณอาจต้องดูการอนุญาตในไดเรกทอรีที่มี symlink อยู่ ในการลบรายการไดเรกทอรีคุณต้องมีสิทธิ์เขียนในไดเรกทอรีที่มี


4

สมมติว่าการตั้งค่าของคุณเป็นสิ่งที่ชอบln -s /mnt/bar ~/fooแล้วคุณควรจะทำrm fooโดยไม่มีปัญหา หากคุณไม่สามารถตรวจสอบให้แน่ใจว่าคุณเป็นเจ้าของfooและได้รับอนุญาตให้เขียน / เรียกใช้ไฟล์ การลบfooจะไม่แตะต้องbarเว้นแต่ว่าคุณจะลบซ้ำ


2

บน CentOS ให้เรียกใช้rm linknameแล้วระบบจะขอให้ "ลบลิงก์สัญลักษณ์?" พิมพ์YและEnterลิงค์จะหายไปและไดเรกทอรีจะปลอดภัย


2

ฉันมีปัญหากับ MinGW (อันที่จริง Git Bash) ทำงานบน Windows Server คำแนะนำข้างต้นดูเหมือนจะไม่ทำงาน ในตอนท้ายสำเนาของไดเรกทอรีที่ทำไว้ในกรณีนั้นจะลบซอฟต์ลิงค์ใน Windows Explorer แล้วลบไอเท็มในถังรีไซเคิล มันทำให้เกิดเสียงเหมือนเป็นการลบไฟล์ แต่ไม่ได้ทำ ทำการสำรองข้อมูล!


3
"มันมีเสียงเหมือนกำลังลบไฟล์ ... " - ว้าว!
Sterex

LMFAO "มันทำเสียงเหมือนกำลังลบไฟล์ ... "
Shivam Jha

ฉันจำฟลอปปี้ดิสก์ได้!
Keith Whittingham

ไม่มีข้อใดเลยที่ใช้งานได้สำหรับฉัน: eddyq @ eddyq-Latitude-E6440: ~ $ ls การดาวน์โหลดเดสก์ท็อป Dropbox-Windows เพลงวิดีโอสาธารณะ w เอกสาร Dropbox samples.desktop รูปภาพเทมเพลต 'VmWare vmx files'
eddyq
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.