دستور xargs در لینوکس/یونیکس آیتم‌ها را از ورودی استاندارد می‌خواند (که با فاصله یا خط جدید مشخص شده است) و یک یا چند بار با هر یک از آرگمان‌های اولیه دستور را اجرا می‌کند. در این آموزش، ساختار دستور xargs و نحوه استفاده از آن در چند نمونه شرح داده شده است.

 

دقت کنید که اگر هیچ دستوری به عنوان آرگومان به xargs ارائه نشود، دستور پیش فرض echo را اجرا می‌نماید. خطوط خالی در ورودی استاندارد نادیده گرفته می‌شوند. آیتم‌هایی که xargs از ورودی استاندارد می‌خواند، می‌توانند با کاراکترهای ‘، “ و \ همراه شوند.

دستور xargs بسیار قدرتمند است، مخصوصاً وقتی با دستوراتی مانند grep یا echo ترکیب شود. در این آموزش، چند کاربرد اساسی از دستور xargs شرح داده شده است.

 

این مطلب نیز ممکن است برای شما مفید باشد: دستور grep در لینوکس

 

ساختار دستور xargs

ساختار دستور xargs به شرح زیر است:

xargs [options] [command [initial-arguments]]

با اجرای دستور man xargs از ترمینال می‌توانید، تمام گزینه‌ها و آرگومان‌های این دستور را مشاهده کنید. بخش زیر چند نمونه از دستورات args را لیست می‌نماید.

 

مثال ساده دستور xargs

دستور xargs بدون هیچ گونه دستوری، آرگومان‌های ورودی استاندارد را echo می‌کند. در مثال زیر، خروجی دستور ls با استفاده از pipe به دستور xargs متصل شده است و دستور xargs بدون هیچ گونه دستوری، لیست فایل‌های ورودی استاندارد را echo می‌نماید.

# ls | xargs

 

مثال زیر، نحوه pipe شدن خروجی دستور echo را با دستور xargs نمایش می‌دهد و دستور xargs از آرگومان pipe شده برای ایجاد پوشه‌ها با دستور mkdir استفاده می‌کند.

# echo 'one two three' | xargs mkdir

 

محدودسازی تعداد آرگمان‌ها

تعداد آرگومان‌های ارسال شده به xargs با محدودیت سیستم شما تعیین می‌شود. کلید -n تعداد آرگومان‌های منتقل شده به یک دستور معین را محدود می‌نماید. دستور xargs به طور مداوم با n تعداد آرگومان اجرا می‌شود تا زمانی که همه آرگومان‌ها تمام شود.

مثال زیر، تعداد آرگومان‌های خوانده شده از ورودی استاندارد را به 2 محدود می‌کند. دستور Xargs خواندن دو آرگومان را همزمان ادامه می‌دهد تا زمانی که همه آن‌ها بطور کامل خوانده شود. بعلاوه، گزینه -t قبل از اجرای دستور، آن را در خروجی استاندارد چاپ می‌نماید.

# echo "file1 file2 file3 file4 file5" | xargs -n 2 -t touch

 

فعال‌سازی اعلان کاربر قبل از اجرا

دستور xargs با گزینه -p  باعث می‌شود، قبل از اجرای دستور از کاربر در مورد تأیید اجرای دستور سوال شود. به عنوان مثال، با اجرای دستورات زیر، قبل از ادامه دادن به ایجاد پوشه‌ها با هر آرگومان، دستور xargs از کاربر درخواست وارد کردن کاراکتر "Y" یا "N" را می‌کند.

# echo Hello World | xargs -p mkdir
# echo one two three | xargs -p -n 1 mkdir

 

حذف فایل با دستور find و xargs

یکی از رایج‌ترین کاربردهای xargs، استفاده از آن با دستور find است. شرایطی را در نظر بگیرید که می‌خواهید پس از اجرای دستور find دسته‌ای از فایل‌ها را حذف کنید یا تغییر نام دهید. در اینجا هر دو دستور find و xargs می‌توانند روی فایل‌هایی که با ویژگی‌های خاصی مطابقت دارند، با هم استفاده شده و سپس یکجا حذف شوند یا تغییر نام داده شوند.

به عنوان مثال، فرض کنید می‌خواهید همه فایل‌های موجود در پوشه /tmp را که در پنج دقیقه گذشته ایجاد شده‌اند، حذف نمایید. برای این کار ابتدا با استفاده از دستور find تمام فایل‌های مطابق با معیارهای انتخاب شده خود را پیدا کرده و سپس خروجی را به دستور xargs که دستور rm را به همراه دارد، متصل نمایید.

# find /tmp/* -cmin -5 
# find /tmp/* -cmin -5 | xargs -t rm
# find /tmp/* -cmin -5

 

جستجوی الگو با استفاده از xargs

یکی دیگر از کاربردهای قدرتمند دستور Xargs، جستجوی یک الگو در لیستی از فایل‌های خروجی یک دستور دیگر مانند ls است. مثال زیر، دستور find و xargs را ترکیب می‌کند. بدین صورت که دستور find تمام فایل‌های متنی (.txt) دایرکتوری فعلی را برمی‌گرداند. سپس نتیجه اجرای دستور یعنی نام فایل‌ها به دستور xargs منتقل می‌شود که در آن، کلمه "file" با استفاده از grep "file" جستجو می‌گردد. اگر این الگو در فایل‌ها وجود داشته باشد، خطوط حاوی الگو به همراه نام فایل در ترمینال چاپ می‌شوند:

# find . -name "*.txt" | xargs grep "file"

 

اجرای چندین دستور با xargs

تاکنون دیدیم که چگونه دستور xargs از آرگمان‌های pipe شده برای انجام چندین کار مختلف مانند تغییر نام دسته‌ای از فایل‌ها، جستجوی الگو و غیره استفاده می‌کند. برای این کار، پس از انجام عملیات pipe، از یک دستور واحد استفاده می‌کند. علاوه بر این، امکان اجرای چندین دستور به همراه xargs نیز وجود دارد.

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

# echo "file1 file2 file3" | xargs -t -I % sh -c '{ touch %; ls -l %; }'

 

اجرای دستورات به صورت موازی

در برخی شرایط، ممکن است از xargs به منظور اجرای همزمان یک دستور برای هر آرگومان استفاده کنید. با بهره‌گیری از دستگاه چند هسته‌ای خود می‌توانید به صورت موازی دستورات را فراخوانی نمایید. گزینه -P دقیقاً این کار را با تعریف حداکثر تعداد پردازش‌ها انجام می‌دهد. به طور پیش فرض، حداکثر تعداد فرآیند 1 است.

به عنوان مثال، دستور xargs زیر با در نظر گرفتن همزمان 5 آرگومان، عدد 1 تا 30 را چاپ می‌کند و این کار را بصورت حداکثر تا 8 پردازش در یک زمان انجام می‌دهد.

# printf %s\\n {1..30} | xargs -n 5 -P 8

 

دریافت ورودی از یک فایل

تاکنون مشاهده کرده‌ایم که ورودی‌های دستور xargs یا از ورودی استاندارد یا از خروجی دستورات دیگر از طریق عملیات pipe خوانده می‌شوند. با این حال، برای دستور xargs امکان خواندن مستقیم ورودی از یک فایل نیز وجود دارد. گزینه -a به شما امکان می‌دهد، برای ورودی‌های مورد نیاز xargs فایلی را تعریف کنید.

دستور xargs زیر، ورودی را از یک فایل input.txt خوانده و سپس با استفاده از دستور touch فایل‌ها را ایجاد می‌نماید.

# cat input.txt
one.txt
two.txt
# xargs -a input.txt touch

 

 

 

 

منبع:

journaldev