touch - ایجاد فایل و تغییربرچسب‌های زمانی فایل

touch - از این دستور برای ساخت فایل یا فایل‌ها ویا تغییر برچسب‌های زمانی فایل استفاده می‌شود.

شکل کلی دستور:

$ touch [options] [filename]

همین‌طور که اطلاع دارید همه‌چیز در گنو/لینوکس یک فایل است. بیایید کمی بیشتر در این مورد با هم بیاموزیم.

اولین سوال که باید در ذهن ایجاد شود چرا؟ جواب این سوال ساده است ولی اگر فقط این جمله را حفظ کرده باشید که «همه چیز در گنو/لینوکس یک فایل است» از بی‌نهایت امکانات گنو/لینوکس بی‌خبر هستید. اگر می‌خواهید جالب بودن کار را با یک مثال متوجه شوید، کافی است به vi دسترسی کافی دهید! در این صورت هرکاربری قادر خواهد بود که تمام فایل‌های شما (همه چیز در گنو/لینوکس یک فایل است.) را ویرایش کند (نفوذ به سیستم شما)!

عده‌ای نظر دیگری دارند وآن‌ها مثال نقض در این مورد می‌آورند، برای مثال dev/random/ یک فایل نیست‌! به گفته‌ی این‌دسته، بهتر است بگوییم:‌ «همه چیز در گنو/لینوکس جریانی از بایت هاست». خب مگر یک فایل چیزی بیش از مجموعه‌ای ساده از بایت هاست که می‌توان خواند یا نوشت‌؟!

ساده‌ترین راه برای ساختن یک فایل در مسیر جاری به نحو زیر است:

$ touch name

نکته: برای نام می‌توان به شکل بالا استفاده کرد ولی از آنجایی name یک نام برای فایلی است که قرار است ایجاد شود بهتر است به شکل زیر باشد ولی اجباری در کار نیست:

$ touch "name"

نکته: اگر از قبل فایلی با این نام باشد، محتویات فایل موجود تغییری نمی‌کند ولی برچسب‌های زمانی (در ادامه توضیح داده خواهد شد) کاملا تغییر می‌کند.

مثال:

$ touch test
$ stat test
  File: `test'
  Size: 5             Blocks: 8          IO Block: 4096   regular file
Device: 80fh/2063d    Inode: 278138      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/  name)   Gid: ( 1000/  name)
Access: 2013-04-03 02:47:54.356362238 +0430
Modify: 2013-04-03 02:47:53.344362211 +0430
Change: 2013-04-03 02:47:53.344362211 +0430
 Birth: -
$ touch test
$ stat test
  File: `test'
  Size: 5             Blocks: 8          IO Block: 4096   regular file
Device: 80fh/2063d    Inode: 278138      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/  name)   Gid: ( 1000/  name)
Access: 2013-04-03 07:04:58.481059626 +0430
Modify: 2013-04-03 07:04:57.465054679 +0430
Change: 2013-04-03 07:04:57.465054679 +0430
 Birth: -

در قسمت بالا فایلی با نام test از قبل ایجاد شده بود، از فایل قبلی با دستور stat یک خروجی گرفتیم، سپس دوباره یک فایل با همان نام قبلی موجود (test) ایجاد کردیم، سپس دوباره با دستور stat از آن خروجی گرفتیم که اگر توجه کرده باشید سه زمان دو فایل کامل تغییر کرده است:

فایل test ایجاد شده در مرحله‌ی اول:

Access: 2013-04-03 02:47:54.356362238 +0430
Modify: 2013-04-03 02:47:53.344362211 +0430
Change: 2013-04-03 02:47:53.344362211 +0430

فایل test ایجاد شده در مرحله‌ی دوم:

Access: 2013-04-03 07:04:58.481059626 +0430
Modify: 2013-04-03 07:04:57.465054679 +0430
Change: 2013-04-03 07:04:57.465054679 +0430

برای ساخت چندین فایل می‌توان به شکل زیر استفاده کرد:

$ touch "one" "two" "three"

یا:

$ touch one two three

نکته: اغلب در برنامه یا اسکریپت‌هایی که شما می‌نویسید با عملگرهای «شیفت به راست» هم می توانید فایل ایجاد کنید وکاربردهایی بیشتری دارند.

گفتیم از این دستور برای تغییر برچسب‌های زمانی (timestamps) هم استفاده می‌شود. فایل‌ها ویژگی و مشخصات زیادی دارند که در میان آن‌ها سه زمان وجود دارد:

  • آخرین زمان دسترسی (last access time): آخرین زمانی که فایل خوانده شده است.
  • آخرین زمان تغییر (last change time): آخرین زمانی که محتوایات فایل تغییر کرده است.
  • آخرین زمان اصلاح (last modification time): آخرین زمانی که فراداده‌ها (Meta dates) تغییر کرده است. مانند مجوزها و...

گزینه‌های اختیاری:

a-: برای تغییر «زمان دسترسی» از این گزینه استفاده می‌شود.

$ touch -a Name

که با دستور ls یک بار خروجی حاصل را می‌بینیم:

$ ls -l Name

-rw-rw-r-- 1 name name 0 Apr  3 06:10 Name

که 06:10 زمان حال را نشان می‌دهد.

B-: برای تغییر ثانیه به زمان قبل استفاده می‌شود.

$ touch -r one -B 5 two

که دراین مثال فایل two به مدت ۵ ثانیه قبل‌تر از فایل مرجع one ساخته می‌شود.

F-: در مقابل گزینه‌ی بالا، این گزینه وجود دارد که برای چند ثانیه بعد استفاده می‌شود.

$ touch -r one -F 5 two

که دراین مثال فایل two به مدت ۵ ثانیه جلوتر از فایل مرجع one ساخته می‌شود.

نکته: ممکن است این دو گزینه‌ی اختیاری (F-و B-) برای شما وجود نداشته باشد.

m-: از این گزینه فقط برای تغییر «زمان اصلاح» استفاده می‌شود.

r-: زمان یک فایل دیگر را به عنوان مرجع برای زمان فایل دیگری در نظر می‌گیرد.

$ ls -l test
-rw-rw-r-- 1 name name 5 Apr  3 02:47 test
$ touch -r test Name
$ ls -l test Name
-rw-rw-r-- 1 name name 0 Apr  3 02:47 Name
-rw-rw-r-- 1 name name 5 Apr  3 02:47 test

که در این حالت «برچسب‌های زمانی» فایل test به عنوان مرجع برای فایل Name در نظر گرفته شد.

t-: یک زمان مشخص شده توسط شما برای فایل تعیین می‌شود.

نکته: برای تعیین زمان به صورت «[[CC]YY]MMDDhhmm[.ss]» در نظر گرفته می‌شود که به صورت زیر توصیف می‌شود:

  • MM: دو عدد برای ماه
  • DD: دو عدد برای روز
  • hh: دو عدد برای ساعت
  • mm: دو عدد برای دقیقه
  • ss: دو عدد برای ثانیه (گزینهٔ اختیاری)
  • CC: دو عدد ابتدایی سال (گزینهٔ اختیاری)
  • YY: دو عدد انتهایی سال (گزینهٔ اختیاری)

نکته: برای وارد کردن اعداد ۹ و یا کمتر از ۹ باید عدد صفر را قبل از بگذارید:

اشتباه:

$ touch -t 9876 Name
touch: invalid date format `9876'

صحیح:

$ touch -t 09080706 Name

حال با دستور stat یک بار صحت کار را بررسی می‌کنیم:

$ stat Name
  File: `Name'
  Size: 0             Blocks: 0          IO Block: 4096   regular empty file
Device: 80fh/2063d    Inode: 266668      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/  name)   Gid: ( 1000/  name)
Access: 2013-04-03 06:47:44.679933277 +0430
Modify: 2013-09-08 07:06:00.000000000 +0430
Change: 2013-04-03 06:47:43.563927742 +0430
 Birth: -

دقیق آن چیزی که ما انتظار داریم:

Modify: 2013-09-08 07:06:00.000000000 +0430