ฉันมีโฟลเดอร์ที่มีไฟล์จำนวนหนึ่งซึ่งมีฮาร์ดลิงก์ (ในโฟลเดอร์เดียวกันหรือที่อื่น) และฉันต้องการยกเลิกการเชื่อมโยงไฟล์เหล่านี้ดังนั้นพวกเขาจึงเป็นอิสระและการเปลี่ยนแปลงเนื้อหาจะไม่มีผลใด ๆ ไฟล์อื่น ๆ (จำนวนลิงก์ของพวกเขากลายเป็น 1)
ด้านล่างนี้ฉันให้วิธีแก้ปัญหาซึ่งโดยทั่วไปจะคัดลอกฮาร์ดลิงก์แต่ละลิงก์ไปยังตำแหน่งอื่นจากนั้นย้ายกลับมาที่เดิม
อย่างไรก็ตามวิธีการนี้ดูเหมือนค่อนข้างหยาบและผิดพลาดได้ง่ายดังนั้นฉันต้องการทราบว่ามีคำสั่งบางคำสั่งที่จะยกเลิกการเชื่อมโยงไฟล์สำหรับฉันหรือไม่
คำตอบที่หยาบ:
ค้นหาไฟล์ที่มีฮาร์ดลิงก์ ( แก้ไข : หากต้องการค้นหาซ็อกเก็ต ฯลฯ ที่มีฮาร์ดลิงก์ให้ใช้find -not -type d -links +1
):
find -type f -links +1 # files only
find -not -type d -links +1 # files, sockets etc.
วิธีหยั่งรู้ในการยกเลิกการเชื่อมโยงไฟล์ (คัดลอกไปยังตำแหน่งอื่นและย้ายกลับ):
แก้ไข: ดัง ที่ Celada กล่าวว่าควรทำ cp -p ด้านล่างเพื่อหลีกเลี่ยงการสูญเสียเวลาและการอนุญาต แก้ไข: สร้างไดเรกทอรีชั่วคราวและคัดลอกไปยังไฟล์ที่อยู่ใต้แทนที่จะเขียนทับไฟล์ temp มันลดความเสี่ยงในการเขียนทับข้อมูลบางส่วนแม้ว่าmv
คำสั่งจะยังคงมีความเสี่ยง (ขอบคุณ @Tobu) แก้ไข: พยายามสร้างไดเรกทอรีชั่วคราวในระบบไฟล์เดียวกัน (@MikkoRantalainen)
# This is unhardlink.sh
set -e
for i in "$@"; do
temp="$(mktemp -d -- "${i%/*}/hardlnk-XXXXXXXX")"
[ -e "$temp" ] && cp -ip "$i" "$temp/tempcopy" && mv "$temp/tempcopy" "$i" && rmdir "$temp"
done
ดังนั้นหากต้องการยกเลิกการเชื่อมโยงฮาร์ดลิงก์ทั้งหมด ( แก้ไข : เปลี่ยน-type f
เป็น-not -type d
ดูด้านบน):
find -not -type d -links +1 -print0 | xargs -0 unhardlink.sh
cp -i
สวิตช์มันจะถ่มน้ำลายใส่ฉันสองสามข้อความเพื่อถามว่าควรแทนที่./fileXXXXXX
( $temp
ไฟล์) แม้ว่า tmpfile ควรให้ชื่อไฟล์ที่ไม่ซ้ำดังนั้นจึงต้องเป็นสภาพการแข่งขันบางอย่างหรืออะไรก็ตามและด้วยความเสี่ยงที่จะสูญเสียข้อมูลบางส่วน
unhardlink.sh
ควรสร้างไดเรกทอรีชั่วคราวภายในไดเรกทอรีเดียวกันที่มีไฟล์ที่ต้องยกเลิกการเชื่อมโยง มิฉะนั้นการเรียกซ้ำของคุณอาจเรียกคืนภายในระบบไฟล์อื่นและคุณจะย้ายสิ่งต่างๆไปตามขอบเขตของระบบไฟล์เนื่องจากไดเรกทอรีชั่วคราวของคุณอยู่ที่ไดเรกทอรีทำงานปัจจุบัน ฉันเดาว่าคุณสามารถผ่าน"$(dirname "$i")/hardlink-XXXXXX"
เป็นอาร์กิวเมนต์ให้ mktemp แทน
fuse
ระบบไฟล์จริง ๆ แล้วมันอาจส่งpath/to/hardlink-XXX
ไปยังสื่อเก็บข้อมูลจริงที่แตกต่างกันกว่าpath/to/original-file
แต่มีไม่มากที่สามารถทำได้เกี่ยวกับเรื่องนี้