منبع اصلی نوشتار زیر در این لینک قرار دارد

دستور xargs

xargs خروجی یک سدتور را بعنوان آرگومان دستور دیگری بعنوان Standard Input توسط Pipe کردن به دستوری دیگر می دهد. بطور پیشفرض و با اجرای تنهای دستور، xargs ورودی را از STDIN طلب می کند و سپس دستور echo را بر روی ورودی (stdin) اجرا و آنرا چاپ می کند. در شکل زیر xargs به تنهایی اجرا شده و در خط های بعدی رشته های بعنوان ورودی وارد شده اند و برای خاتمه دادن به ورود رشته ها کلید های Ctrl+D فشرده شده است. در خط آخر دستور echo خروجی را چاپ کرده است.

یا نخستین مثال زیر اعداد چاپ شده توسط دستور echo را به عنوان ورودی و آرگومان به دستور xargs داده و xargs دستور echo را بر روی ورودی ها اجرا و اعداد را چاپ می کند. توجه کنید که دستوری که بطور پیشفرض و در صورتی که هیچ دستوری برای اجرا شدن توسط xargs اجرا خواهد شد، دستور echo است، پس هر دو دستور زیر عملا یکسان هستند.

echo 1 2 3 4 5 6 | xargs

echo 1 2 3 4 5 6 | xargs echo

سوئیچ n- تعداد خروجی ها در خط را نشان می دهند. دستور echo 1 2 3 4 5 6 | xargs همگی را در یک خط نشان داد، اما برای اینکه در هر خط فقط 2 عدد نشان داده شود از n 2- استفاده می کنیم.

echo 1 2 3 4 5 6 | xargs -n2

سوئیچ p- اعلان یا Prompt را نشان می دهد که با وارد کردن y از کاربر تاییدیه برای نشان دادن خروجی را می گیرد. اگر n وارد شود خروجی نشان داده نمی شود. دستور زیر ترکیبی از سوئیچ های n- و p- را نشان می دهد.

echo 1 2 3 4 5 6 | xargs -n2 -p

سوئیچ t- برای نشان دادن دستور همراه با خروجی استفاده می شود. همانطور که گفته شد دستور xargs اگر بدون هیچ دستوری استفاده شود (نخستین مثال)، با استفاده از سوئیچ t- دستور نشان داده می شود.

xargs -t

همچنین می توان سوئیچ t- را سوئیچ n- ترکیب کرد.

در واقع xargs خروجی های یک دستور را بعنوان آرگومان به دستور دیگر می فرستد. یکی از کاربرد های دستور xargs استفاده آن به همراه دستور find است. به طوری که خروجی های دستور find (فایل ها و دایرکتوری های یافت شده) را به عنوان آرگومانی به دستوریی که توسط xargs اجرا می شود می فرستیم. بطور مثال با دستور find تمامی فایل های تهی (empty) را پیدا کرد و لیست آنها را به عنوان آرگومان به دستور rm می فرستیم که دستور rm توسط دستور xargs انجام می شود. در واقع xargs واسطه ای میان find و rm است. توجه کنید هر دستور دارای دو پارامتر است، یکی سوئیج یا option که مانند سوئیچ l- در دستور ls و آرگومان که مانند دایرکتوری تعیین شده برای دستور ls.

  • مثال یک : دستور زیر در دایرکتوری جاری (مشخص شده با یک نقطه) تمامی فایل ها که به c. ختم می شوند (با پسوند c) را پیدا کرده و آنها را به عنوان آرگومان به دستور rm فرستاده و پاک می کند.

find . -name “*.c” | xargs rm -rf

  • مثال دوم : در مثال یک فایل هایی که شامل فضای خالی هستند بطور مثال فایلی به نام filename one.c به دلیل داشتن فضای خالی یا White Space پاک نخواهند شد. با استفاده از سویچ 0- در xargs در عوض Whitespace ها مثل کلید های Space و Tab و NewLine کاراکتر null در نظر گرفته خواهد شد. دستور زیر تمامی فایل ها با پسوند c. در دایرکتوری جاری را که شامل فضای خالی هستند را پاک خواهد کرد.
find . -name “*.c” -print0 | xargs -0 rm -rf

آکولاد های باز و بسته {} نشان دهنده فهرست آرگومان ها هستند و زمانی مه دستور به بیش از دو آرگومان نیاز داشته باشد باید از {} استفاده کنید.

  • مثال سوم : دستور زیر تمامی فایل ها با پسوند bck. را از دایرکتوری جاری پیدا کرده و بع عنوان لیستی به دستور mv برای انتقال به دایرکتوری old.files می فرستد.

find . -name “*.c” -print0 | xargs -0 -I {} mv {} ~/codes

  • مثال سوم : نام تمامی فایل هایی که در دایرکتوری جاری به c. ختم می شوند را به تغییر می دهد به گونه ای که یک رشته amir به آنها اضافه می کند. بطور مثال اگر نام فایل file1.c بود پس با اجرای دستور زیر نام آن به amir_file.c تغییر می کند.

{}_ls *.c | xargs -I {} mv {} amir

  • مثال چهارم : تمامی فایل های با فرمت jpg را پیدا کرده و آنها را آرشیو می کند.
find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
  • مثال پنجم : تمامی فایل های با فرمت jpg را به اکسترنال هارد کپی می کند.

ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory

  • مثال ششم : تمامی فایل ها با پسوند log از دایرکتوری خانگی را پاک می کند.

find ~ -name “*.log” -print0 | xargs -0 rm -f

  • مثال هفتم : تمامی فایل های دایرکتوری خانگی را به اکسترنال هارد کپی می کند. چون از p- استفاده کرده ایم پس یک اعلان برای گرفتن تاییدیه از شما برای کپی کردن یا عدم کپی فایل مربوطه نشان داده خواهد شد.

ls -R ~ | xargs -p -n 1 -i cp {} /external-hard-drive/directory

  • مثال هشتم : پخش فهرستی از فایل ها با پسوند mp3. اگر از 0- استفاده نکیند برنامه mplayer فایل ها با فضای خالی یا Newline را پخش نمی کند.

find . -iname “*.mp3″ -print0 | xargs -0 -I mp3file mplayer mp3file

سوئیچ I- آرگومان را از وردی خوانده و عمل جایگزینی را با رشته تعیین شده انجام داده و آنرا به دستور می فرستد. بطور خاص در مثال هشتم، find تمامی فایل ها با پسوند mp3 را پیدا می کند. (به دلیل استفاده از iname- جستجو حساس به متن نیست). چون از 0- استفاده کرده ایم پس کاراکتر null بجای فضای خالی و Newline در نظر گرفته می شود. سپس I- ارگومان های اولیه یا Initial Argument ها را با رشته mp3file جایگزین و آرگومان جدید را به دستور mplayer ارسال می کند.

ps -ef | grep amirnami | awk ‘{ print $2 }’ | sudo xargs kill -9

  • مثال دهم : فهرست کردن تمامی فایل هایی که در 60 دقیقه گذشته در دایرکتوری directory/ تغییر کرده اند. (خواندن مطلب مرتبط)

find /target_directory -type f -mmin -60 -print0 | xargs -0 ls -l

مطالب مرتبط با دستور find

  1. دستور find – بخش اول
  2. یافتن تمامی فایل ها در مالکیت یک کاربر ویژه (دستور find – بخش دوم)
  3. چگونه در یونیکس ها فایل ها را بر اساس زمان پیدا کنیم؟ ( دستور find – بخش سوم)

 



برچسب ها : , , , , , , , , , ,

به سیاره لینوکس امتیاز دهید

به اين صفحه امتياز دهيد