1) ما هو أمر touch ولماذا نستخدمه؟
أمر touch له وظيفتان أساسيتان:
- إنشاء ملف جديد فارغ إذا كان الملف غير موجود.
- تحديث الطوابع الزمنية (timestamps) لملف موجود (مثل وقت التعديل ووقت الوصول) بدون تغيير محتواه.
متى يفيدك؟
- تجهيز ملفات بسرعة (مثل ملفات مشروع:
README.md,index.html) - “تحديث” الملف ليظهر كأنه تم تعديله الآن (مفيد في البناء Build أو Makefiles)
- اختبار صلاحيات/مسارات
- تعديل وقت الملف لسبب تنظيمي أو لتجربة سكربتات تعتمد على الوقت
2) الصيغة العامة (Syntax)
touch [OPTIONS] FILE...Bash- تقدر تكتب ملف واحد أو عدة ملفات.
- إذا لم يوجد الملف → ينشئه.
- إذا موجود → يحدّث الوقت (افتراضيًا يحدّث access + modification).
3) إنشاء ملفات جديدة باستخدام touch
أ) إنشاء ملف واحد
cd ~/project
touch new_file.txtBashتأكد أنه انشأه:
ls -l new_file.txtBashب) إنشاء عدة ملفات دفعة واحدة
touch file1.txt file2.txt file3.txtBashج) إنشاء ملفات داخل مجلدات (مع المسار)
touch ~/project/logs.txt
touch ~/project/docs/readme.txtBashملاحظة مهمة: إذا كان المجلد
docsغير موجود سيعطيك خطأ.
الحل: أنشئ المجلد أولًا:
mkdir -p ~/project/docs
touch ~/project/docs/readme.txtBashد) إنشاء ملف باسم فيه مسافات
لازم تستخدم اقتباس:
touch "My Notes.txt"Bash4) فهم الـ Timestamps ببساطة (مهم)
في لينكس غالبًا تهمنا أوقات مثل:
- mtime: وقت آخر تعديل للمحتوى (Modification time)
- atime: وقت آخر وصول/قراءة (Access time)
لعرض أوقات الملفات بوضوح استخدم:
stat existing_file.txtBashأو بشكل مختصر (لعرض mtime):
ls -l existing_file.txtBash5) تحديث أوقات الملفات باستخدام touch
أ) التحديث الافتراضي (يحدث atime و mtime)
touch existing_file.txtBashب) تحديث وقت الوصول فقط: -a
touch -a existing_file.txtBashج) تحديث وقت التعديل فقط: -m
touch -m existing_file.txtBash6) تعيين وقت محدد (مهم جدًا)
أ) باستخدام -d (سهل وواضح)
touch -d "2023-04-01 10:30:00" existing_file.txtBashتأكد:
stat existing_file.txtBashب) باستخدام -t (صيغة رقمية)
الصيغة:[[CC]YY]MMDDhhmm[.ss]
مثال (2023-04-01 10:30):
touch -t 202304011030 existing_file.txtBashمثال مع ثواني:
touch -t 202304011030.45 existing_file.txtBash7) نسخ الوقت من ملف إلى ملف آخر: -r (مفيد جدًا)
إذا تريد تجعل ملف يأخذ نفس وقت ملف ثاني:
touch -r source.txt target.txtBashيعني “اجعل target مثل source في timestamps”.
8) منع إنشاء الملف إذا غير موجود: -c
أحيانًا تريد فقط تحديث الوقت إذا الملف موجود، وإذا غير موجود لا تنشئه.
touch -c maybe_exists.txtBashهذا مفيد في السكربتات لتجنب إنشاء ملفات بالغلط.
9) استخدام touch مع الأقنعة/wildcards (تنبيه مهم)
في النص الذي أرسلته كان مثال:
touch *.mdBashتنبيه: هذا لا “ينشئ كل ملفات md من العدم”
الـ * يعمل على الملفات الموجودة بالفعل. يعني:
- إذا يوجد ملفات
.md→ سيحدّث أوقاتها - إذا لا يوجد أي
.md→ غالبًا سيعطي خطأ مثل:touch: cannot touch '*.md': No such file or directory
إذا تريد إنشاء عدة ملفات بنمط معيّن فعلًا (مثال 1..5):
touch file{1..5}.mdBashينشئ:
- file1.md file2.md file3.md file4.md file5.md
مثال آخر:
touch chapter_{01..10}.txtBash10) أمثلة عملية مفيدة للمبتدئ
أ) تجهيز مشروع بسرعة
mkdir -p ~/project/myapp
cd ~/project/myapp
touch README.md main.py .gitignore
ls -laBashب) معرفة الفرق بين atime و mtime بالتجربة
cd ~/project
touch demo.txt
stat demo.txt
cat demo.txt > /dev/null
stat demo.txt
echo "hi" >> demo.txt
stat demo.txtBash- القراءة تغيّر atime (حسب إعدادات النظام)
- الكتابة تغيّر mtime
11) أخطاء شائعة وحلولها
أ) “No such file or directory” عند مسار داخل مجلد غير موجود
touch ~/project/abc/file.txtBashالحل:
mkdir -p ~/project/abc
touch ~/project/abc/file.txtBashب) مشكلة touch *.md
إذا ما في ملفات md موجودة، الأفضل تستخدم:
touch file{1..3}.mdBash12) تدريب سريع (Practice)
نفذ التالي بالترتيب:
cd ~/project
mkdir -p touch_practice
cd touch_practice
touch a.txt
sleep 1
touch -m a.txt
stat a.txt
touch file{1..5}.md
ls -l
touch -d "2023-04-01 10:30:00" a.txt
stat a.txt
touch -c not_here.txt
ls -lBashهل الشرح في المحتوى الأصلي كافي؟
هو جيد كبداية، لكن احتاج تصحيح/توضيح نقطة مهمة جدًا:
{1..N} لإنشاء ملفات كثيرة بشكل صحيح
touch *.md لا ينشئ ملفات جديدة من الصفر إلا إذا كان هناك ملفات مطابقة موجودة.
والشرح الموسع اللي فوق أضاف أهم الأشياء العملية:
stat للفهم الحقيقي للأوقات
-t صيغة الوقت الرقمية
-r نسخ الوقت من ملف لآخر
-c منع إنشاء ملفات بالغلط