rm -rf ติดตามลิงก์สัญลักษณ์หรือไม่


72

ฉันมีไดเรกทอรีเช่นนี้:

$ ls -l
total 899166
drwxr-xr-x 12 me scicomp       324 Jan 24 13:47 data
-rw-r--r--  1 me scicomp     84188 Jan 24 13:47 lod-thin-1.000000-0.010000-0.030000.rda
drwxr-xr-x  2 me scicomp       808 Jan 24 13:47 log
lrwxrwxrwx  1 me scicomp        17 Jan 25 09:41 msg -> /home/me/msg

rm -rและฉันต้องการที่จะลบออกไปโดยใช้

อย่างไรก็ตามฉันกลัวrm -rจะติดตาม symlink และลบทุกอย่างในไดเรกทอรีนั้น (ซึ่งแย่มาก)

ฉันไม่พบอะไรเกี่ยวกับสิ่งนี้ในหน้าคู่มือ พฤติกรรมที่แน่นอนของการทำงานrm -rfจากไดเรกทอรีด้านบนนี้คืออะไร?


16
มันยากแค่ไหนที่จะสร้างหุ่นจำลองที่มี symlink ชี้ไปที่ไฟล์จำลองและดำเนินการตามสถานการณ์? แล้วคุณจะรู้ว่ามันทำงานอย่างไร!

คำตอบ:


57

ตัวอย่างที่ 1: การลบไดเร็กทอรีที่มีลิงก์แบบนุ่มไปยังไดเร็กทอรีอื่น

susam@nifty:~/so$ mkdir foo bar
susam@nifty:~/so$ touch bar/a.txt
susam@nifty:~/so$ ln -s /home/susam/so/bar/ foo/baz
susam@nifty:~/so$ tree
.
├── bar
   └── a.txt
└── foo
    └── baz -> /home/susam/so/bar/

3 directories, 1 file
susam@nifty:~/so$ rm -r foo
susam@nifty:~/so$ tree
.
└── bar
    └── a.txt

1 directory, 1 file
susam@nifty:~/so$

ดังนั้นเราจะเห็นว่าเป้าหมายของซอฟต์ลิงค์ยังมีชีวิตอยู่

ตัวอย่างที่ 2: การลบลิงก์ซอฟต์ไปยังไดเร็กทอรี

susam@nifty:~/so$ ln -s /home/susam/so/bar baz
susam@nifty:~/so$ tree
.
├── bar
   └── a.txt
└── baz -> /home/susam/so/bar

2 directories, 1 file
susam@nifty:~/so$ rm -r baz
susam@nifty:~/so$ tree
.
└── bar
    └── a.txt

1 directory, 1 file
susam@nifty:~/so$

เฉพาะซอฟต์ลิงค์จะถูกลบ เป้าหมายของซอฟต์ลิงค์ยังมีชีวิตอยู่

ตัวอย่างที่ 3: ความพยายามที่จะลบเป้าหมายของซอฟต์ลิงค์

susam@nifty:~/so$ ln -s /home/susam/so/bar baz
susam@nifty:~/so$ tree
.
├── bar
   └── a.txt
└── baz -> /home/susam/so/bar

2 directories, 1 file
susam@nifty:~/so$ rm -r baz/
rm: cannot remove 'baz/': Not a directory
susam@nifty:~/so$ tree
.
├── bar
└── baz -> /home/susam/so/bar

2 directories, 0 files

ไฟล์ในเป้าหมายของลิงก์สัญลักษณ์ไม่สามารถอยู่รอดได้

การทดลองข้างต้นได้กระทำบนระบบ Debian GNU / Linux 9.0 (ยืด)


12
rm -rf baz / * จะลบเนื้อหา
Wyrmwood

2
ใช่ถ้าคุณทำ rm -rf [symlink] แล้วเนื้อหาของไดเรกทอรีเดิมจะหายไป! ระวังให้มาก
Buttle Butkus

@frnknstn คุณพูดถูก ฉันเห็นพฤติกรรมเดียวกับที่คุณพูดถึงในระบบ Debian ล่าสุดของฉัน ฉันจำไม่ได้ว่า Debian เวอร์ชันใดที่ฉันทำการทดลองก่อนหน้านี้ ในการทดลองก่อนหน้าของฉันเกี่ยวกับ Debian เวอร์ชันเก่า a.txt ต้องรอดชีวิตจากตัวอย่างที่สามหรือฉันต้องทำข้อผิดพลาดในการทดสอบของฉัน ฉันได้อัปเดตคำตอบกับพฤติกรรมปัจจุบันที่ฉันสังเกตเห็นบน Debian 9 และพฤติกรรมนี้สอดคล้องกับสิ่งที่คุณพูดถึง
Susam Pal

19

ไดเร็กทอรี / home / me / msg ของคุณจะปลอดภัยหากคุณ rm -rf ไดเร็กทอรีซึ่งคุณรัน ls เฉพาะ symlink เท่านั้นที่จะถูกลบออกไม่ใช่ไดเรกทอรีที่ชี้ไป

สิ่งเดียวที่ฉันจะระวังก็คือถ้าคุณเรียกบางอย่างเช่น "rm -rf msg /" (ด้วยเครื่องหมายสแลช) อย่าทำเช่นนั้นเพราะจะลบไดเรกทอรีที่ msg ชี้ไปแทนที่จะเป็น symg ของ msg ตัวเอง


3
"สิ่งเดียวที่ฉันจะระวังก็คือถ้าคุณเรียกบางอย่างเช่น" rm -rf msg / "(พร้อมกับเครื่องหมายสแลช) อย่าทำเช่นนั้นเพราะจะลบไดเรกทอรีที่ msg ชี้ไปแทนที่จะเป็น msg symlink ตัวเอง " - ฉันไม่พบว่าสิ่งนี้เป็นจริง ดูตัวอย่างที่สามในคำตอบของฉันด้านล่าง

1
ฉันได้รับผลลัพธ์เช่นเดียวกับ @Susam ('rm -r symlink /' ไม่ได้ลบเป้าหมายของ symlink) ซึ่งฉันยินดีเพราะมันเป็นความผิดพลาดที่ทำได้ง่ายมาก
Andrew Crabb

5

rmควรลบไฟล์และไดเรกทอรี หากไฟล์เป็นลิงก์สัญลักษณ์ลิงก์จะถูกลบออกไม่ใช่เป้าหมาย มันจะไม่ตีความลิงก์สัญลักษณ์ ตัวอย่างเช่นสิ่งที่ควรเป็นพฤติกรรมเมื่อลบ 'ลิงก์ที่ใช้งานไม่ได้' ออก rm ด้วย 0 ไม่ใช่ด้วยไม่ใช่ศูนย์เพื่อระบุความล้มเหลว

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