كيفية فصل اسم الملف والامتداد في Bash

كيفية فصل اسم الملف والامتداد في Bash
كيفية فصل اسم الملف والامتداد في Bash

مقدمة:

عند العمل مع الملفات في Bash، قد تحتاج غالبًا إلى فصل اسم الملف عن امتداده. يستخدم الأسلوب الشائع الأمر `cut`، ولكن قد تفشل هذه الطريقة مع أسماء الملفات التي تحتوي على فترات متعددة.

على سبيل المثال، قد يتم تقسيم اسم ملف مثل `a.b.js` بشكل غير صحيح إلى `a` و`b.js` بدلاً من `a.b` و`js`. على الرغم من أن Python توفر حلاً سهلاً باستخدام `os.path.splitext()`، إلا أن استخدام Python قد لا يكون دائمًا الخيار الأكثر كفاءة. تستكشف هذه المقالة طرقًا أفضل لتحقيق هذه المهمة في Bash.

يأمر وصف
${variable%.*} توسيع المعلمة لإزالة الامتداد من اسم الملف.
${variable##*.} توسيع المعلمة لاستخراج الامتداد من اسم الملف.
awk -F. يضبط فاصل الحقل على فترة تستخدم لتقسيم اسم الملف.
OFS="." فاصل حقل الإخراج في awk، يستخدم لإعادة بناء اسم الملف بدون ملحق.
NF-- يقلل عدد الحقول بمقدار واحد في awk، مما يؤدي إلى إزالة الامتداد بشكل فعال.
${BASH_REMATCH} المصفوفة التي تحتوي على المطابقات من التعبير العادي في Bash.
local variable يعلن عن متغير ذو نطاق محلي داخل دالة في Bash.

انهيار مفصل لحلول باش

توفر البرامج النصية طرقًا مختلفة لفصل اسم الملف وامتداده في Bash. يستخدم البرنامج النصي الأول توسيع معلمة Bash. المتغير ${FILE%.*} يزيل الامتداد عن طريق تجريد كل شيء من النقطة الأخيرة إلى نهاية السلسلة، بينما ${FILE##*.} يلتقط التمديد عن طريق أخذ كل شيء بعد الفترة الماضية. هذه الطريقة واضحة وفعالة لمعظم بنيات أسماء الملفات. يستخدم البرنامج النصي الثاني awk، أداة قوية لمعالجة النصوص في البيئات المشابهة لنظام Unix. عن طريق ضبط فاصل الحقل على فترة باستخدام -F.، فهو يسمح بتقسيم اسم الملف إلى أجزاء. فاصل حقل الإخراج OFS="."، وتقليل عدد الحقول باستخدام NF-- هي تقنيات لإعادة تجميع اسم الملف دون امتداده.

يستخدم النص الثالث التعبيرات العادية في Bash، مع الاستفادة من ذلك ${BASH_REMATCH} لالتقاط المجموعات في مباراة regex. يستخدم هذا البرنامج النصي نمطًا يقسم اسم الملف إلى مجموعتين: واحدة للاسم الأساسي والأخرى للامتداد. وأخيرًا، يقوم البرنامج النصي للوظيفة المخصصة بتغليف منطق توسيع المعلمة داخل الوظيفة، مما يعزز إمكانية إعادة استخدام التعليمات البرمجية وسهولة القراءة. يستخدم local variable الإعلانات للحفاظ على نطاق المتغيرات داخل الوظيفة، مما يمنع الآثار الجانبية غير المقصودة في البرامج النصية الأكبر حجمًا. توضح كل طريقة أسلوبًا مختلفًا لحل نفس المشكلة، مما يعرض تنوع وقوة البرمجة النصية لـ Bash.

استخدام توسيع المعلمة في باش

البرمجة النصية باش

#!/bin/bash
# Script to extract filename and extension using parameter expansion
FILE="a.b.js"
FILENAME="${FILE%.*}"
EXTENSION="${FILE##*.}"
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"

استخدام Awk لفصل اسم الملف والامتداد

باش مع أوك

#!/bin/bash
# Script to extract filename and extension using awk
FILE="a.b.js"
FILENAME=$(echo "$FILE" | awk -F. '{OFS="."; NF--; print $0}')
EXTENSION=$(echo "$FILE" | awk -F. '{print $NF}')
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"

استخدام التعبيرات العادية في باش

باش البرمجة النصية مع regex

#!/bin/bash
# Script to extract filename and extension using regex
FILE="a.b.js"
[[ "$FILE" =~ (.*)\.(.*) ]]
FILENAME=${BASH_REMATCH[1]}
EXTENSION=${BASH_REMATCH[2]}
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"

استخدام وظيفة مخصصة في Bash

البرمجة النصية لـ Bash مع وظيفة مخصصة

#!/bin/bash
# Function to extract filename and extension
extract_filename_extension() {
  local file="$1"
  echo "Filename: ${file%.*}"
  echo "Extension: ${file##*.}"
}
# Call the function with a file
extract_filename_extension "a.b.js"

استكشاف طرق بديلة لمعالجة الملفات في Bash

بالإضافة إلى الأساليب التي تمت مناقشتها بالفعل، هناك تقنيات أخرى مفيدة في Bash لمعالجة أسماء الملفات والامتدادات. تتضمن إحدى هذه الطرق استخدام basename و dirname الأوامر. basename يمكن استخدامه لاستخراج اسم الملف من المسار، بينما dirname يسترد مسار الدليل. يمكن أن يؤدي الجمع بين هذه الأوامر مع توسيع المعلمات إلى فصل أسماء الملفات والامتدادات بشكل فعال. على سبيل المثال، باستخدام basename "$FILE" ".${FILE##*.}" يزيل الامتداد من اسم الملف. يعد هذا الأسلوب مفيدًا بشكل خاص عند العمل مع مسارات الملفات الكاملة بدلاً من أسماء الملفات فقط.

طريقة أخرى تنطوي على استخدام sed، محرر دفق قوي لتصفية النص وتحويله. من خلال صياغة التعبيرات العادية المناسبة، sed يمكن عزل اسم الملف والامتداد. على سبيل المثال، الأمر echo "$FILE" | sed 's/\(.*\)\.\(.*\)/\1 \2/' يقسم اسم الملف والامتداد، ويضعهما في مجموعات التقاط منفصلة. هذه التقنية مرنة ويمكنها التعامل مع بنيات أسماء الملفات المعقدة. يؤدي استكشاف هذه الأدوات والأساليب الإضافية إلى توسيع قدرتك على معالجة بيانات الملف في Bash، مما يوفر حلولاً قوية لسيناريوهات البرمجة النصية المتنوعة.

الأسئلة المتداولة حول معالجة ملفات Bash

  1. ما هو الغرض من ${FILE%.*} يأمر؟
  2. يقوم بإزالة الامتداد من اسم الملف عن طريق تجريد كل شيء بعد الفترة الأخيرة.
  3. كيف يمكن لل ${FILE##*.} عمل الأمر؟
  4. يقوم باستخراج الامتداد عن طريق أخذ كل شيء بعد الفترة الأخيرة في اسم الملف.
  5. ماذا فعلت awk -F. تفعل في البرنامج النصي المقدم؟
  6. يقوم بتعيين فاصل الحقل على فترة، مما يسمح بتقسيم اسم الملف إلى أجزاء.
  7. لماذا الاستخدام NF-- في awk النصي؟
  8. فهو يقلل عدد الحقول بمقدار واحد، مما يؤدي إلى إزالة الامتداد من اسم الملف بشكل فعال.
  9. كيف تساعد التعبيرات العادية في استخراج اسم الملف والامتداد؟
  10. فهي تسمح بمطابقة الأنماط وتجميعها، مما يمكن أن يعزل أجزاء مختلفة من اسم الملف.
  11. ما فائدة استخدام وظيفة مخصصة في Bash؟
  12. تعمل الوظيفة المخصصة على تحسين إمكانية إعادة استخدام التعليمات البرمجية وإمكانية قراءتها، مما يجعل البرامج النصية أكثر نمطية.
  13. كيف basename مساعدة في أسماء الملفات؟
  14. فهو يستخرج اسم الملف من مسار الملف الكامل، ويزيل الامتداد اختياريًا.
  15. يستطيع sed يمكن استخدامها لمعالجة اسم الملف؟
  16. نعم، sed يمكن استخدام التعبيرات العادية لتحويل وعزل أجزاء من أسماء الملفات.

اختتام الحلول لاستخراج اسم الملف والامتداد

في الختام، يمكن استخراج أسماء الملفات والامتدادات في Bash بشكل فعال من خلال طرق مختلفة، كل منها يناسب الاحتياجات والتفضيلات المختلفة. سواء كنت تستخدم توسيع المعلمات، أو awk، أو sed، أو الوظائف المخصصة، فإن هذه التقنيات توفر حلولاً مرنة وفعالة. يضمن فهم هذه الأوامر واستخدامها أن البرامج النصية يمكنها التعامل مع أسماء الملفات ذات الفترات المتعددة والتعقيدات الأخرى دون أخطاء.