ตรวจสอบว่าสองพา ธ ชี้ไปที่ไฟล์เดียวกันหรือไม่


12

ฉันมีสคริปต์เพื่อสร้าง symlinks ซ้ำในไดเรกทอรีบ้านของฉันไปยังไดเรกทอรีการตั้งค่าของฉันเพื่อให้ไฟล์อยู่ภายใต้การควบคุมเวอร์ชัน ฉันต้องการข้ามไฟล์ที่มี symlinked อยู่แล้วผ่านไดเรกทอรีหลัก นั่นคือถ้าฉันมีไฟล์ / ไดเรกทอรีเหล่านี้:

~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar

ฉันจะตรวจสอบว่า ~ / foo / bar และ ~ / settings / foo / bar เป็นไฟล์เดียวกันได้อย่างไร

แก้ไข : D'oh อีกไม่กี่นาทีของการค้นหาเปิดเผยคำตอบ :readlink -f $path

คำตอบ:


6

หากสองไฟล์มี deviceID และ inode เดียวกันแสดงว่าเป็นไฟล์เดียวกัน statเครื่องมือบรรทัดคำสั่งนี้จะทำให้ง่ายต่อการค้นหา

if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ]`

...

ใช้งานได้กับไฟล์ symlinked หรือไฟล์ hardlinked


5
stat -Lที่จะปฏิบัติตามการเชื่อมโยงสัญลักษณ์คุณจะต้อง
Gilles 'หยุดความชั่วร้าย'

เช่นเดียวกับ @Gilles กล่าวว่าหากไม่มีสวิตช์ -L คุณอาจได้รับผลการผิดพลาดจากการแจกแจงบางอย่าง
Olaseni

19

เชลล์จำนวนมากมี-efโอเปอเรเตอร์สำหรับtestbuiltin (หรือคำพ้องความหมาย[) เพื่อทดสอบว่าสองพา ธ ชี้ไปยังไฟล์ที่มีอยู่เดิมหรือไม่ (ตามลิงก์สัญลักษณ์) ซึ่งรวมถึง bash, dash, pdksh, ksh88, ksh93 และ zsh แต่ไม่ใช่ POSIX sh ใน bash, ksh หรือ zsh คุณยังสามารถใช้-efในการ[[ … ]]สร้างแบบมีเงื่อนไข

if ! [ "$1" -ef "$2" ]; then # $1 and $2 are different files

1
ตาม manpage ของฉัน -ef ทำสิ่งเดียวกันกับคำตอบของ Rich Homolka
user13852

2
@ user13852 -efมีข้อได้เปรียบในการพกพาได้มากกว่า (เร็วกว่าเล็กน้อย แต่ก็ไม่ใช่เพื่อที่คุณจะสังเกตได้เกือบตลอดเวลา) ตัวอย่างเช่นใช้งานได้กับ * BSD, OSX, BusyBox รวมถึง Linux / Cygwin (GNU) นอกจากนี้ยังชัดเจนขึ้นเพราะทำสิ่งที่ต้องการอย่างแท้จริง ข้อได้เปรียบเดียวที่ฉันเห็นได้statคือเมื่อคุณไม่ต้องการติดตาม symlinks
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

0

สำหรับซอฟต์ลิงค์ (สร้างด้วยln -s) คุณสามารถrealpathใช้ได้ สิ่งนี้จะใช้ไม่ได้กับฮาร์ดลิงก์

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