النقاط الرئيسية
إذا كان لديك اسم ملف يحتوي على مسافات على نظام Linux، فإن وضع اسم الملف بين علامتي اقتباس يتيح لـ Bash التعامل معه بشكل صحيح. يجعل إكمال علامات التبويب إدخال أسماء الملفات على سطر الأوامر أمرًا سهلاً، حتى إذا كانت تحتوي على مسافات.
مثل معظم أنظمة التشغيل، يدعم Linux أسماء الملفات التي تحتوي على مسافات. ولكن استخدام هذه الأسماء على سطر الأوامر ليس بالأمر السهل دائمًا. فيما يلي عدة طرق يمكنك من خلالها التعامل مع أسماء الملفات التي تحتوي على مسافات.
كيف تعمل أسماء الملفات في لينكس؟
يجب أن يكون لكل شيء مخزن على القرص الصلب لجهاز الكمبيوتر اسم. وبدون الاسم، لن توجد أي ملفات. يجب تحديد جميع التطبيقات والبرامج التي يتم تشغيلها عند تشغيل جهاز الكمبيوتر، وجميع البرامج التي تستخدمها، وتخزينها في نظام ملفات. هذا التعريف هو اسم الملف.
ينطبق الأمر نفسه على الملفات التي تقوم بإنشائها أو تثبيتها. تحتاج جميع مستنداتك وصورك وموسيقاك إلى أسماء ملفات. وبدون أسماء الملفات، لن يكون من الممكن وجود أي من أصولك الرقمية. ولأن أسماء الملفات مهمة للغاية، يحاول لينكس جاهدًا فرض أقل قدر ممكن من القواعد حول تكوينها.
في Linux، قد يحتوي اسم الملف على أي حرف باستثناء الشرطة المائلة للأمام “/” والحرف الفارغ 0x00. يُستخدم الحرف الفارغ لتمييز نهاية السلسلة، لذا لا يمكن أن يكون موجودًا في السلسلة نفسها، وإلا فإن Linux سيقوم بقص اسم الملف عند موضع الحرف الفارغ. تُستخدم الشرطة المائلة للأمام “/” كفاصل في مسارات الدليل.
أسماء الملفات حساسة لحالة الأحرف، ويمكن أن يصل طوله إلى 255 بايت، بما في ذلك حرف null. يمكن أن يصل طول مسارات الدليل إلى 4096 بايتًا، بما في ذلك حرف null. لاحظ أن هذا هو طولها بالبايتات، والذي قد لا يساوي الأحرف بشكل مباشر. على سبيل المثال، تستغرق أحرف Unicode ذات 16 بت بايتين لكل منها.
سوف يعرف عشاق الحوسبة القديمة وأولئك الذين لديهم ذاكرة طويلة أنه في الأيام الأولى لأجهزة الكمبيوتر الشخصية، نظام تشغيل القرص من مايكروسوفتكان نظام التشغيل DOS غير حساس لحالة الأحرف وكان لديه حد أقصى لاسم الملف يبلغ ثمانية أحرف، بالإضافة إلى امتداد مكون من ثلاثة أحرف.
كان عليك أن تكون مدروسًا للغاية ومبدعًا في بعض الأحيان عند تسمية الملفات. وبالمقارنة، فإن الحرية التي نتمتع بها اليوم تعني أنه يمكننا تسمية الملفات بأي اسم نريده، دون التفكير كثيرًا في أي شيء آخر غير الوصف الذي ننشئه لهذا الملف.
لكن مع أسماء الملفات، ما يربكنا في أغلب الأحيان ليس الأحرف التي نكتبها، بل المسافات بينها.
لماذا تعتبر المسافات الموجودة في أسماء الملفات في لينكس أمرا مزعجا
ستفسر الأصداف مثل Bash سلسلة من الكلمات مفصولة بمسافة على أنها وسيطات أوامر فردية، وليس وسيطة واحدة. إليك مثال باستخدام touch لإنشاء ملف جديد يسمى “my new file.txt”.
touch my new file.txt
ls
كما يمكننا أن نرى، ls يظهر لنا أنه تم إنشاء ثلاثة ملفات، واحد يسمى “my”، وآخر يسمى “new”، وواحد آخر يسمى “file.txt”.
لاحظ أن touch لم يشتكي أو يلقي بخطأ. إنه ينفذ ما يعتقد أننا نطلبه منه. لذا فهو يعيدنا بصمت إلى سطر الأوامر. إذا لم نكن متحمسين للتحقق، فلن نعرف أن الأمور لم تسير وفقًا للخطة.
لإنشاء الملف الذي نريده، يتعين علينا استخدام الاقتباس أو الإفلات.
كيفية الاقتباس والهروب من المساحات
إذا اقتبسنا اسم الملف بالكامل، touch يعرف أنه يحتاج إلى التعامل مع النص المقتبس كحجة واحدة.
touch 'my new file.txt'
ls
هذه المرة نحصل على الملف الوحيد الذي نتوقعه.
يمكننا الحصول على نفس النتيجة إذا استخدمنا حرف الشرطة المائلة العكسية “\“للهروب من المسافات. من خلال “الهروب” من المسافات، لا يتم التعامل معها كأحرف خاصة – أي فواصل وسيطة – بل يتم اعتبارها مسافات عادية قديمة.
touch my\ second\ new\ file.txt
ls
هذا يعمل، ولكن إفلات المسافات يجعل كتابة أسماء الملفات أبطأ وأكثر عرضة للخطأ. يمكن أن تصبح الأمور سيئة للغاية إذا كانت أسماء الدلائل تحتوي على مسافات أيضًا.
cp dir one/my\ text\ file.txt dir\ two/my\ text file.bak
ls
يقوم هذا الأمر بنسخ ملف نصي واحد من دليل يسمى “dir one” إلى دليل يسمى “dir two”، ويحفظ النسخة كملف BAK. وهو مثال بسيط إلى حد ما.
كيفية إصلاح مشكلة المساحة من مصدرها
إذا كانت هذه ملفاتك الخاصة، فيمكنك اتخاذ قرار سياسي بعدم استخدام المسافات مطلقًا، وإنشاء أسماء ملفات (أو إعادة تسميتها بشكل مجمع) مثل هذا.
mynewtextfile.txt
من المؤكد أن هذا حل قوي ولكنه لا يزال قبيحًا. هناك خيارات أفضل، مثل استخدام الشرطات-“أو الشرطة السفلية”_” لفصل كلماتك.
my-new-text-file.txt
my_new_text_file.txt
سيعمل كلا الأمرين على تجنب المشكلة، كما أنهما قابلان للقراءة. إذا كنت لا تريد إضافة أحرف إضافية إلى أسماء الملفات، فيمكنك استخدام حقيبة الجمل لتجعل أسماء ملفاتك قابلة للقراءة، مثل هذا:
MyNewTextFile.txt
توسيع علامات التبويب يجعل التعامل مع المسافات أمرًا سهلاً
بالطبع، لن يساعدك تبني اتفاقية تسمية والالتزام بها إلا عند التعامل مع ملفاتك الخاصة. من غير المرجح أن تتبع الملفات التي تأتي من أي مكان آخر اتفاقية التسمية التي تتبناها.
يمكنك استخدام توسيع علامات التبويب لمساعدتك في “ملء” أسماء الملفات بدقة. لنفترض أننا نريد حذف ملف BAK الذي أنشأناه في “dir two”، باستخدام rm.
نبدأ بكتابة “rm dir” لأننا نستخدم rm الأمر ونحن نعلم أن اسم الدليل يبدأ بـ “dir”.
rm dir
يؤدي الضغط على مفتاح “Tab” إلى قيام Bash بالبحث عن المطابقات في الدليل الحالي.
هناك دليلان يبدآن بـ “dir”، وفي كلتا الحالتين يكون الحرف التالي هو المسافة. لذا يضيف Bash حرف الشرطة المائلة العكسية “\“ومسافة. ثم ينتظر Bash حتى نوفر الحرف التالي. فهو يحتاج إلى الحرف التالي للتمييز بين المطابقتين المحتملتين في هذا الدليل.
سوف نكتب “t” للرقم “اثنين”، ثم نضغط على “Tab” مرة أخرى.
يكمل Bash اسم الدليل بالنسبة لنا وينتظر منا كتابة بداية اسم الملف.
لدينا ملف واحد فقط في هذا الدليل، لذا فإن كتابة الحرف الأول من اسم الملف، “m”، يكفي لإعلام Bash بالملف الذي نريد استخدامه. كتابة “m” والضغط على “Tab” يكمل اسم الملف بالنسبة لنا، و”Enter” ينفذ الأمر بالكامل.
يجعل توسيع علامة التبويب من السهل التأكد من الحصول على أسماء الملفات بشكل صحيح، كما أنه يعمل على تسريع التنقل والكتابة على سطر الأوامر بشكل عام.
كيفية استخدام أسماء الملفات مع المسافات في نصوص Bash
ليس من المستغرب أن تواجه البرامج النصية نفس المشكلات المتعلقة بالمسافات في أسماء الملفات كما يحدث في سطر الأوامر. إذا كنت تمرر اسم ملف كمتغير، فتأكد من وضع علامتي اقتباس بين اسم المتغير.
يتحقق هذا البرنامج النصي الصغير من الدليل الحالي بحثًا عن الملفات التي تطابق نمط الملف “*.txt”، ويخزنها في متغير يسمى file_list.أ for يتم استخدام الحلقة لإجراء إجراء بسيط على كل واحد.
#!/bin/bashfile_list=*.txtfor file in $file_listdo ls -hl $filedone
انسخ هذا النص إلى محرر واحفظه في ملف يسمى “files.sh”. ثم استخدم chmod أمر لجعله قابلاً للتنفيذ.
chmod +x files.sh
لدينا بعض الملفات في هذا الدليل. أحدها له اسم ملف بسيط، والاثنان الآخران يستخدمان الشرطة السفلية “_“أو شرطات”-“بدلاً من المسافات. هذا ما نراه عندما نقوم بتشغيل البرنامج النصي.
./files.sh
يبدو أن هذا يعمل بشكل جيد. ولكن دعنا نغير الملفات الموجودة في الدليل إلى ملفات تحتوي على مسافات في أسمائها.
./files.sh
يتم التعامل مع كل كلمة في كل اسم ملف كما لو كانت اسم ملف بحد ذاته، وبالتالي يفشل البرنامج النصي. ولكن كل ما نحتاج إلى القيام به لجعل البرنامج النصي يتعامل مع المسافات في أسماء الملفات هو وضع علامات اقتباس $file متغير داخل for حلقة.
#!/bin/bashfile_list=*.txtfor file in $file_listdols -hl "$file"done
لاحظ أن علامة الدولار “$“يوجد داخل علامتي الاقتباس. لقد أجرينا هذا التغيير وحفظناه في ملف البرنامج النصي “files.sh”. هذه المرة، تمت معالجة أسماء الملفات بشكل صحيح.
./files.sh
متباعدة، ولكن ليست متقشرة
إن تجنب المسافات في أسماء الملفات الخاصة بك لن يؤدي إلا إلى حد ما. فمن المحتم أن تصادف ملفات من مصادر أخرى تحمل أسماء تحتوي على مسافات. ولحسن الحظ، إذا كنت بحاجة إلى التعامل مع هذه الملفات على سطر الأوامر أو في البرامج النصية، فهناك طرق سهلة للقيام بذلك.