मेरे पास एक फ़ोल्डर है जिसमें कुछ निश्चित संख्या में फाइलें होती हैं जिनके हार्ड लिंक होते हैं (उसी फ़ोल्डर में या कहीं और), और मैं इन फ़ाइलों को डी-हार्ड करना चाहता हूं, इसलिए वे स्वतंत्र हो जाते हैं, और उनकी सामग्री में परिवर्तन किसी को प्रभावित नहीं करेगा। अन्य फ़ाइल (उनकी लिंक संख्या 1 हो जाती है)।
नीचे, मैं एक समाधान देता हूं जो मूल रूप से प्रत्येक हार्ड लिंक को किसी अन्य स्थान पर कॉपी करता है, फिर इसे वापस जगह पर ले जाता है।
हालाँकि यह तरीका कच्चा और त्रुटि-रहित प्रतीत होता है, इसलिए मैं जानना चाहूंगा कि क्या कुछ कमांड है जो मेरे लिए एक फाइल को डी-हार्डिंक करेगा।
कठोर जवाब:
वे फ़ाइलें ढूंढें जिनमें हार्ड लिंक हैं ( संपादित करें : सॉकेट आदि को खोजने के लिए जिनके पास हार्डलिंक हैं, उपयोग करें find -not -type d -links +1
):
find -type f -links +1 # files only
find -not -type d -links +1 # files, sockets etc.
किसी फ़ाइल को डी-हार्डिंक करने के लिए एक क्रूड विधि (इसे किसी अन्य स्थान पर कॉपी करें, और इसे वापस ले जाएं):
संपादित करें: जैसा कि सेलाडा ने कहा, टाइमस्टैम्प और अनुमतियों को खोने से बचाने के लिए, नीचे एक cp -p करना सबसे अच्छा है। संपादित करें: एक अस्थायी निर्देशिका बनाएं और इसके तहत एक फ़ाइल में कॉपी करें, एक अस्थायी फ़ाइल को अधिलेखित करने के बजाय, यह कुछ डेटा को अधिलेखित करने के लिए जोखिम को कम करता है, हालांकि 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
तो, करने के लिए संयुक्त राष्ट्र-hardlink सभी हार्ड लिंक ( संपादित करें : बदल -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
, लेकिन इसके बारे में बहुत कुछ नहीं किया जा सकता है।