ฉันจะแสดงรายการไฟล์ที่ไม่มี symlink ได้อย่างไร


10

ฉันมีไดเรกทอรี "myfiles" ขนาดใหญ่เต็มไปด้วยเอกสารเบ็ดเตล็ดและไม่ต้องการแก้ไขโครงสร้าง

ฉันจึงสร้าง (หลาย) ไดเรกทอรีอื่น ๆ สำหรับแต่ละชั้นของเอกสาร ตัวอย่างเช่นฉันมีไดเรกทอรี "images" ซึ่งมีsymlink ไปยังแต่ละไฟล์.jpgหรือ.cr2ในไดเรกทอรี "myfiles" พร้อมไฟล์อธิบายอื่น ๆ สำหรับแต่ละ symlink (ที่มีชื่อไฟล์เดียวกัน) พร้อมคำอธิบายและข้อมูลเมตาอื่น ๆ symlink ในไดเร็กทอรี / images อาจมีชื่อแตกต่างจากไฟล์ที่ลิงก์ดั้งเดิม

ฉันพยายามหาวิธีที่ง่ายที่สุดเพื่อให้แน่ใจว่าไฟล์รูปภาพทุกไฟล์ในไดเรกทอรี "myfiles" มี symlink ในไดเรกทอรี "images"

ดูตัวอย่างของโครงสร้างโฟลเดอร์

/myfiles/a.doc
/myfiles/b.jpg
/myfiles/c.cr2
/myfiles/d.mov

ควรส่งผล

/images/b_800x600.jpg
/images/b_800x600.desc
/images/c_3820x5640.cr2
/images/c_3820x5640.cr2

ไม่ใช่คำตอบเต็มรูปแบบ แต่คุณสามารถบันทึกผลลัพธ์ของ a find /myfiles -type fไปยังไฟล์จากนั้นใช้find /images -type l -exec readlink {} \; | egrep myfilesเพื่อรับรายการไฟล์ที่มี symlinked /imagesแล้ววนซ้ำผลลัพธ์ที่ทำsedในแต่ละรายการเพื่อลบพา ธ ในไฟล์แรกที่คุณบันทึกไว้ มี symlink และไฟล์ที่เหลืออยู่คือไฟล์ที่ไม่มี symlink
Bratchley

2
เป็นไปได้ไหมที่คุณจะใช้ hardlinks แทนดังนั้นคุณสามารถใช้ตัวนับ hardlink เพื่อดูว่าคุณมีลิงค์หรือไม่? การใช้ls -lคุณสามารถดูจำนวนฮาร์ดลิงค์ในคอลัมน์ที่สอง
Lambert

ทำตามที่ @Lambert พูด rmsymlink เหล่านั้น dirs และใช้pax -rwl -s "\|.*regex|modifes_filename|" /path/to/myfiles/*.jpg /path/to/jpg_dirเป็นตัวอย่างเพื่อรับฮาร์ดลิงก์ที่มีชื่อไฟล์ที่เปลี่ยนแปลงโดยทางโปรแกรมสำหรับไฟล์ที่ตรงกับ jpgs ของคุณเท่านั้น คุณสามารถได้รับมากกว่านั้น - เช่นการแบตช์ตามเวลาการเปลี่ยนแปลงและอื่น ๆ
mikeserv

คำตอบ:


6

หากฉันตอบคำถามไม่ถูกต้องคุณต้องใช้ไฟล์ในไฟล์ของฉันซึ่งไม่มี symlink ในภาพ:

#!/bin/bash

OIFS="$IFS"
IFS=$'\n'

files="$(find myfiles/ -type f -name '*.jpg' -or -name '*.cr2')"
for f in $files; do
    list="$(find -L images/ -xtype l -samefile "$f")"
    if [[ "$list" == "" ]]; then
        echo "$f does not have symlink."
    fi
done

IFS="$OIFS"

มีข้อแม้ด้วยวิธีนี้หากคุณมีไฟล์ a.jpg ในไดเรกทอรี myfiles / 1 และคุณมี symlink ไปยังไฟล์นั้นในภาพไดเรกทอรี / 3 หรือเพียงแค่ในภาพ / ไฟล์จะไม่ถูกรายงานด้วย symlink ที่ขาดหายไป


ขอบคุณมาก! ใช่คุณเข้าใจถูกต้อง ปิด แต่ไม่มาก ความผิดของฉันไม่ใช่ของคุณ :-) ตัวอย่างที่ฉันให้ไว้แสดงไดเรกทอรี myfiles แบบง่ายๆ ในความเป็นจริงไฟล์ภาพภายใต้ไฟล์ของฉันสามารถอยู่ในระดับใดก็ได้ของไดเรกทอรีที่ซ้อนกัน
Robert Alexander

ฉันแก้ไขคำตอบเพื่อค้นหาทั้งไฟล์ของฉัน แต่ตรวจสอบว่านี่คือสิ่งที่คุณต้องการหรือไม่
taliezin

เกือบจะมี :-) hiccups สคริปต์ของคุณเมื่อไฟล์มีช่องว่าง (และอาจอึอื่น ๆ เช่นอะพอสโทรฟีเดียว "ในพวกเขา ...
Robert Robert

ฉันคิดว่าตอนนี้มันน่าจะใช้ได้แล้ว
taliezin

การดัดแปลงครั้งล่าสุดของคุณจะแยกทุกๆ f ที่การเกิดขึ้นของตัวอักษรทุกตัว n! :-) ฉันเลือกบรรทัด IFS ไปที่ IFS = จากนั้นขึ้นบรรทัดใหม่จากแป้นพิมพ์แล้วก็อีก "ตอนนี้ตัวแยกดูเหมือนจะทำงานได้ แต่ฉันได้ลำดับ" missinglinks.sh: 11: missinglinks.sh: [[: ไม่พบ "
Robert Alexander

3

ฉันสมมติว่าไฟล์ภายใต้myfilesไม่ใช่ลิงก์สัญลักษณ์และไม่มีชื่อไฟล์ใดที่มีบรรทัดใหม่ (วิธีการของฉันยังคงสามารถใช้งานได้หากสมมติฐานเหล่านี้ถูกละเมิด แต่มีความซับซ้อนมากขึ้น) ฉันยังสมมติว่าคุณมีreadlinkยูทิลิตีทั่วไปและสนับสนุน-fเส้นทางที่เป็นมาตรฐานซึ่งเป็นกรณีบน Linux (ทั้ง GNU และ BusyBox) แต่ไม่ใช่ บนเช่น OSX

สร้างรายการไฟล์และจัดเรียงเพื่อวัดผลที่ดี:

find /myfiles -type f -print | sort >all.list

สร้างรายการเป้าหมายลิงก์สัญลักษณ์ด้วยพา ธ สัมบูรณ์

find /images -type f -exec readlink -f {} \; | sort >linked.list

แสดงรายการไฟล์ที่ไม่ได้เชื่อมโยง:

comm -32 all.list linked.list

หากคุณใช้เชลล์ที่สนับสนุนการทดแทนกระบวนการคุณสามารถวางเชลล์ทั้งหมดไว้ในคำสั่งเดียว:

comm -23 <(find /myfiles -type f -print | sort) \
         <(find /images -type f -exec readlink -f {} \; | sort)

หากลิงก์ด้านล่าง/imagesเป็นแบบสัมบูรณ์คุณสามารถใช้readlinkโดยไม่มี-fตัวเลือกซึ่งมีอยู่ใน * BSD และ OSX


ฉันกำลังจะโพสต์สิ่งที่ชอบcommคำสั่งของคุณแต่ตอนนี้ฉันจะไม่เห็นว่าคุณได้ทำ อย่างไรก็ตามการเปลี่ยนเส้นทางจากsortไม่มีเหตุผล ดังนั้นกระบวนการทดแทนจะไม่แสดงผลใด ๆ นอกจากนี้คุณยังสามารถเพิ่มหลายไดเรกทอรีถัด/imagesถ้าคุณต้องการที่จะหาไฟล์ใน/myfilesที่ไม่ได้ symlinked จากใด ๆ /imagesของจำนวนของไดเรกทอรีที่นอกเหนือจาก
tripleee

1
ดูstackoverflow.com/questions/7665/…สำหรับทางเลือกในการreadlink -f
tripleee

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