क्या इनकोड का उपयोग करके किसी फ़ाइल या निर्देशिका का नाम बदलना संभव है?


10

मैंने / होम निर्देशिका को एक अलग विभाजन में बदल दिया है और इससे फ़ाइलों तक नहीं पहुंच सका, कुछ मैं इस प्रश्न से हल करने में सक्षम हूं - आप किसी भिन्न विभाजन पर स्विच करने के बाद पिछले माउंट की सामग्री का उपयोग कैसे कर सकते हैं?

यदि मैंने निर्देशिका का इनकोड नोट किया होता, तो क्या मैं उस निर्देशिका का नाम बदलने के लिए अकेले उपयोग कर पाऊंगा?

जवाबों:


6

आप किसी फ़ाइल (निर्देशिका या जो भी) का उपयोग कर केवल इनोड के ज्ञान का उपयोग करके नाम बदल सकते हैं find, लेकिन अगर (ए) युक्त फाइल सिस्टम माउंट नहीं है, या यदि (बी) एक और फाइल-सिस्टम है जो एक गैर-खाली निर्देशिका पर माउंट किया गया है जिसमें शामिल है आप जिस फ़ाइल में रुचि रखते हैं, वह फ़ाइल आपके सिस्टम द्वारा आसानी से उपलब्ध नहीं है। मामले में (ए), आपको फ़ाइल सिस्टम को माउंट करने की आवश्यकता है इससे पहले कि आप सामग्री का कुछ भी कर सकते हैं, जिसमें नामकरण भी शामिल है, और मामले में (बी), आपको उस फाइल सिस्टम को अनमाउंट करने की आवश्यकता है जो "युक्त" निर्देशिका के शीर्ष पर स्थित है। वह फ़ाइल जिसका आप नाम बदलना चाहते हैं। ऐसा लगता है कि आप मामले (ख) के बारे में पूछ रहे हैं।

यदि मैं आपको सही ढंग से समझता हूं, तो आप अपनी पुरानी /homeनिर्देशिका (जो आपके रूट विभाजन पर स्थित है) को सुलभ बनाने की कोशिश कर रहे हैं , जबकि अभी भी अपने नए ट्रांसफ़ॉर्म का उपयोग कर रहे हैं /home। यदि आप चाहते हैं कि, निम्नलिखित करें:

सभी फाइलें बंद करें और लॉग आउट करें। इसके बाद लॉग इन rootकरें (इसके लिए वर्चुअल टर्मिनल का उपयोग करें- Ctrl-Alt-F2 दबाएं) निम्नलिखित चलाएँ:

umount /home
mv /home /home-old
mkdir /home
mount -a
ls /home
ls /home-old

यदि सब ठीक है, तो लॉग आउट करें और अपने आप को वापस लॉग इन करें और सब ठीक होना चाहिए।

संयोग से, किसी फ़ाइल को उसके इनोड के केवल ज्ञान का उपयोग करके नाम बदलने का आदेश दिया गया है (यह मानते हुए कि फ़ाइल वर्तमान निर्देशिका में है):

find . -maxdepth 1 -inum 123456789 -exec mv {} mynewname \;

123456789इनकोड संख्या कहां है, निश्चित रूप से। (ध्यान दें कि findफ़ाइल नाम और उसका पथ निर्धारित करता है और इस जानकारी को पास करता है mv; मौजूदा फ़ाइल नाम को शामिल किए बिना किसी फ़ाइल का नाम बदलने का कोई तरीका नहीं है, लेकिन अगर यह सिर्फ यह है कि आप फ़ाइल नाम को नहीं जानते हैं , तो यह काफी है सरल।)


क्या mv कमांड इनोड के आधार पर सीधे नाम बदल सकता है? मुझे लगता है कि खोज आदेश फ़ाइल नाम को उसके सामान्य पाठ रूप में लौटाता है।
vfclists

@vfclists: नहीं, mvकिसी भी तरह से स्वीकार नहीं करेंगे।
वाइल्डकार्ड

6

एक सामान्य यूनिक्स फाइल सिस्टम में, इनोड पर आधारित फाइल को स्थानांतरित करने के लिए सामान्य रूप से संरचनात्मक रूप से असंभव है। इसका कारण यह है कि किसी फ़ाइल का नाम बदलने का अर्थ है कि इसमें मौजूद निर्देशिका से इसकी निर्देशिका प्रविष्टि को हटाना, और कहीं और निर्देशिका बनाना। लेकिन इनोड में निर्देशिका प्रविष्टि के लिए एक सूचक नहीं होता है, इसमें केवल फ़ाइल मेटाडेटा (टाइमस्टैम्प, अनुमतियां, आदि) और फ़ाइल सामग्री (पॉइंटर्स) होती है।

कई हार्ड लिंक वाली फ़ाइल के लिए, आप इनमें से किसका नाम बदल रहे हैं? इनकोड पर्याप्त जानकारी नहीं है।

एक निर्देशिका के लिए, कुछ फाइल सिस्टम पर, अकेले दिए गए इनोड को कार्य करना संभव होगा:

  1. निर्देशिका की सामग्री पढ़ें, जो निश्चित रूप से इनोड से पहुंच योग्य है।
  2. के लिए निर्देशिका प्रविष्टि का पता लगाएँ ..। यह मूल निर्देशिका की ओर इशारा करता है।
  3. मूल निर्देशिका में, सही इनोड संख्या के साथ एक निर्देशिका प्रविष्टि की तलाश करें।

हालाँकि यह कई धारणाएँ बनाता है:

  • यदि एक ही इनोड के लिए कई प्रविष्टियाँ हों तो क्या होगा? वास्तव में, यह एक समस्या नहीं है: यह शायद ही कभी अभ्यास में होता है क्योंकि अधिकांश यूनिक्स वेरिएंट निर्देशिकाओं के स्पष्ट लिंक से मना करते हैं।
  • क्या ..पहले स्थान पर मौजूद है? यह फाइलसिस्टम के प्रकार पर निर्भर करता है। कुछ फाइल सिस्टम के लिए एक स्पष्ट प्रविष्टि है ..; दूसरों के लिए, इन प्रविष्टियों को फाइलसिस्टम चालक द्वारा फेक किया जाता है। यदि ..मौजूद नहीं है, तो यह दृष्टिकोण मौलिक रूप से असंभव है।
  • भले ही फाइल सिस्टम ..लिंक शामिल करता है , एक और ठोकर है जो स्पष्ट नहीं हो सकता है: चरण 1 कर्नेल के अंदर संभव हो सकता है, लेकिन इसके लिए कोई इंटरफ़ेस नहीं है। कई यूनिक्स वेरिएंट का कोई इंटरफ़ेस नहीं है जो किसी फ़ाइल को उसके इनोड के माध्यम से खोलने की अनुमति देता है, क्योंकि यह अनुमतियों को बायपास करेगा। उदाहरण के लिए, अनुमतियों के साथ एक फ़ाइल rwxr-xr-x(यानी विश्व-पठनीय) जो अनुमतियों के साथ एक निर्देशिका में स्थित है rwx------(यानी केवल उसके मालिक के लिए सुलभ) किसी और के लिए नहीं बल्कि निर्देशिका स्वामी के लिए स्वीकार्य नहीं है। यह अकेले इनोड से निर्धारित नहीं किया जा सकता है - फ़ाइल वास्तव में एक और कड़ी के माध्यम से सुलभ हो सकती है!

अपशॉट यह है कि नहीं, नाम बदलने सहित कुछ भी करना संभव नहीं है, केवल एक फाइल के साथ उसका इनकोड दिया गया है। आपको फ़ाइल के लिए एक पथ होना चाहिए।

किसी फ़ाइल को उसके इनोड को देखते हुए कार्य करने का एकमात्र व्यावहारिक तरीका यह है कि पहले एक रास्ता ढूंढें, उदाहरण के लिए find -inum, और फिर कार्य करने के लिए पथ का उपयोग करें। यह आपकी स्थिति में मदद नहीं करता है, जहाँ फ़ाइल को एक आरोह बिंदु द्वारा छायांकित किया जाता है। माउंट पॉइंट द्वारा छायांकित फ़ाइलों तक पहुँचने का कोई पोर्टेबल तरीका नहीं है; लिनक्स पर, जैसा कि आपने खोजा है, आप बाइंड माउंट का उपयोग कर सकते हैं।


-1

धन्यवाद। यह सबसे ज्यादा मददगार रहा है। यह मुझे YouTube से डाउनलोड की गई वीडियो फ़ाइलों के ट्रांसक्रिप्ट के बोझिल नामों को बदलने की अनुमति देता है, लेकिन फिर भी सार्थक फ़ाइल नाम। उदाहरण के लिए:

you-get -O 20191129_tucker https://www.youtube.com/watch?v=cyCpkwX9Wvs

... मुझे फाइलें देता है:

20191129_tucker.webm; और "सेविंग टकर कार्लसन टुनाइट 11-29-19 फुल- ब्रेकिंग फॉक्स न्यूज 29 नवंबर, 2019.en.rrt"

मैं इसे अन्यथा आपके द्वारा प्राप्त की जाने वाली बहुत उपयोगी वस्तु की कमी मानता हूं।

मैं दूसरा फ़ाइल नाम निम्नानुसार बदल सकता हूं:

$ ls -il "सेविंग टकर कार्लसन टुनाइट 11-29-19 फुल- ब्रेकिंग फॉक्स न्यूज 29 नवंबर, 2019.en.srt"

... यह मुझे शुरुआत में ही इसकी इनकोड संख्या के साथ फाइल लिस्टिंग देता है:

13902671 -rw-r - r-- 1 जेम्स जेम्स 55793998 30 नवंबर 18:44 सेविंग टकर कार्लसन आज रात 11-29-19 फुल- ब्रेकिंग फॉक्स न्यूज 29 नवंबर 2019.srt

... तो मैं चला:

mvi 13902671 20191129_tucker.srt

मेरी मवी बैश शेल स्क्रिप्ट है:

#!/bin/bash
inodeNumber=$1
newFileName=$2
find . -maxdepth 1 -inum $inodeNumber -exec mv {} $newFileName \;

यह पहले बताई गई बातों से परे कोई नई जानकारी नहीं जोड़ता है। इसके अलावा, आपकी mviस्क्रिप्ट में अछूते चर का उपयोग किया जाता है , जिसका अर्थ है कि यह विफल हो जाएगा यदि स्क्रिप्ट में दिए गए किसी भी तर्क में व्हॉट्सएप वर्ण (या संभावित रूप से तब भी जब वे ग्लोबिंग वर्ण होते हैं)।
Kusalananda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.