ฉันจะลบลิงค์สัญลักษณ์ทั้งหมดด้วยเป้าหมายพิเศษได้อย่างไร


43

ด้วยคำสั่ง:

ls -la *

ฉันสามารถแสดงลิงก์สัญลักษณ์ทั้งหมดของฉันได้

ฉันจะลบลิงก์สัญลักษณ์ทั้งหมดที่เชื่อมโยงไปยังโฟลเดอร์พิเศษได้อย่างไร

ตัวอย่างเช่น:

ในไดเรกทอรีของusr/local/binฉันฉันมีรายการต่อไปนี้:

lrwxrwxrwx 1 root root 50 Apr 22 14:52 allneeded -> /usr/local/texlive/2011/bin/x86_64-linux/allneeded
lrwxrwxrwx 1 root root 47 Apr 22 14:52 amstex -> /usr/local/texlive/2011/bin/x86_64-linux/amstex
lrwxrwxrwx 1 root root 24 Apr 23 19:09 arara -> /home/marco/.arara/arara

ตอนนี้ฉันต้องการลบลิงก์ทั้งหมดที่มีเส้นทาง /usr/local/texlive/


1
คุณหมายถึงลบ symlink ทั้งหมดที่เชื่อมโยงไปยังโฟลเดอร์เป้าหมายหรือไม่ หรือย้าย symlink ที่พบทั้งหมดไปยังโฟลเดอร์เฉพาะ?
George M

@ ผู้ใช้: ฉันหมายถึงการลบลิงก์ออก
Marco Daniel

คำตอบ:


63

โปรดอ่านคำตอบเพิ่มเติม มันมากขึ้นถึงจุดแม้ว่าจะไม่ได้คะแนนสูงในจุดนี้

คุณสามารถใช้สิ่งนี้เพื่อลบลิงก์สัญลักษณ์ทั้งหมด:

find -type l -delete

กับfindรุ่นที่ทันสมัย

ในการค้นหารุ่นที่เก่ากว่ามันอาจจะต้องเป็น:

find -type l -exec rm {} \;
# or
find -type l -exec unlink {} \;

หากต้องการ จำกัด เป้าหมายลิงก์ที่แน่นอนโดยสมมติว่าไม่มีพา ธ ใด ๆ ที่ประกอบด้วยอักขระบรรทัดใหม่:

 find -type l | while IFS= read -r lnkname; do if [ "$(readlink '$lnkname')" == "/your/exact/path" ]; then rm -- "$lnkname"; fi; done

หรือจัดรูปแบบเป็นอย่างดี

 find -type l |
 while IFS= read -r lnkname;
 do
   if [ "$(readlink '$lnkname')" = "/your/exact/path" ];
   then
     rm -- "$lnkname"
   fi
 done

ifสามารถของหลักสูตร ได้แก่ grepสภาพที่ซับซ้อนมากขึ้นเช่นตรงกับรูปแบบด้วย


ปรับให้เหมาะกับกรณีของคุณ:

find -type l | while IFS= read -r lnk; do if (readlink "$lnk" | grep -q '^/usr/local/texlive/'); then rm "$lnk"; fi; done

หรือจัดรูปแบบเป็นอย่างดี:

find -type l | while IFS= read -r lnk
do
  if readlink "$lnk" | grep -q '^/usr/local/texlive/'
  then
    rm "$lnk"
  fi
done

คำสั่งนี้ลบ symlink ทั้งหมดหรือไม่ โปรดดูการแก้ไขของฉันด้านบน ..
Marco Daniel

@Marco: ใช่สามบรรทัดแรกจะ กำลังแก้ไขเพิ่มเติม :)
0xC0000022L

ฉันจะเพิ่มคำสั่ง-printท้ายfindคำสั่งเพื่อรับความเห็นด้วยภาพ
runlevel0

30

ด้วยความทันสมัยfindที่รองรับ-lname:

find /usr/local/bin -lname '/usr/local/texlive/*' -delete

ควรทำมัน


1
นั่นเป็นทางออกที่ยอดเยี่ยมและเรียบง่าย ฉันทดสอบและใช้งานได้เหมือนมีเสน่ห์ ขอบคุณ
Marco Daniel

น่าจะเป็นได้find /usr/local/bin
James Youngman

1
ไม่ทันสมัยแม้แต่จำเป็น GNU findมีมา-lnameนานกว่าที่ฉันรักษาไว้ (ตั้งแต่ประมาณปี 2003)
James Youngman

@JamesYoungman: ขอบคุณ! โดยที่ทันสมัยfindฉันหมายจริงๆ findGNU ;) ฉันใช้usr/local/binเพราะนั่นคือสิ่งที่ OP ใช้
Christoffer Hammarström

5

findวิธีการแก้ปัญหาที่ดีมาก

ในกรณีที่พบของคุณไม่สนับสนุนต่อไปนี้เป็นวิธีการที่ใช้เพียงเปลือกอื่นและ-lnamereadlink

cd /usr/local/bin
for f in *; do
  case "$(readlink "$f")" in /usr/local/texlive/*)
    rm "$f"
    ;;
  esac
done

1

ด้วยzsh:

rm -f /usr/local/bin(@e'{[[ $REPLY:P = /usr/local/texlive/* ]]}')

$REPLY:Pแก้ไขเส้นทางไปสู่ ​​symlink ที่ไม่มีปัญหาดังนั้นสมมติว่า/usr/local/texlivesymlink เป็นตัวของตัวเองมันจะลบไฟล์ทั้งหมดซึ่งหลังจาก symlink resolution live /usr/local/textliveซึ่งจะรวมลิงค์ไป/usr/local/texlive/fooยัง แต่ยังไปยัง../texlive/barหรือไปยัง/usr/./local/texlive/whateverหรือ/some/other/symlinkซึ่งเป็นตัวบ่งชี้ symlink /usr/local/texliveเป็นต้น .


0

ไปที่เส้นทางของคุณและกำหนดค่าเส้นทางด้วยตัวคุณเอง

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk '{print $9}'|xargs rm -rf

เนื่องจากสิ่งเหล่านี้เป็นเส้นทางแบบusr/local/binที่grepค้นหาgrep -Eนั่นคือหนทางที่จะไป มิฉะนั้นจะไม่มีผลลัพธ์ที่ตรงกัน นอกจากนี้hในlsไม่ได้ให้บริการวัตถุประสงค์ใด ๆ ที่นี่! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). ดูเพิ่มเติมman lsหรือman grep
ss_iwe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.