آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

پرسش و پاسخ شماره ۸



چگونه می‌توانم تمام فایلها را به طور بازگشتی برای یک رشته جستجو نمایم؟

90% اوقات، تمام آنچه لازم دارید یکی از اینهاست:

# :سطرهای انطباق یافته را چاپ می‌کند (GNU grep)
grep -r -- "$search" .

# :فقط نام فایلها را برگشت و چاپ می‌کند (GNU grep)
grep -r -l -- "$search" .

اگر برنامه grep شما فاقد گزینه ‎ -r ‎ است، می‌توانید از find استفاده کنید، یا اگرمی‌خواهید از برخورد با پیوندهای نمادین اجتناب نمایید:

find . -type f -exec grep -l -- "$search" {} \;

کاراکترهای {} با نام فایل تعویض خواهند شد.

این فرمان کندتر از آنست که لازم بشود، زیرا find فقط با یک نام فایل grep را فراخوانی می‌کند، که منجر به فراخوانی‌های بسیار grep (یکبار برای هر فایل) می‌گردد. چون grep نام فایلهای چندگانه را در خط فرمان می‌پذیرد، به find می‌تواند دستور داده شود که یکمرتبه آنرا با چندین نام فایل فراخوانی کند:

find . -type f -exec grep -l -- "$search" {} +

کاراکتر '+' در انتها به find دستور می‌دهد grep را با هر تعداد نام فایل ممکن فراخوانی کند، صرفه جویی پردازش و اجرای سریعتر. این مثال در find پوسته POSIX کار می‌کند، به عنوان مثال در سولاریس به همان خوبی findخیلی اخیر گنو.

یونیکس سنتی یک برنامه کمکی به نام xargs برای همین منظور دارد:

find . -type f | xargs grep -l -- "$search"

به هرحال، اگر نام فایل شامل فاصله یا سایر فوق کاراکترها باشد، نیاز به استفاده از گزینه ‎-print0‎ گنو یا BSD دارید:

find . -type f -print0 | xargs -0 grep -l -- "$search"

گزینه‌های ‎ -print0‎ و ‎-0‎ اطمینان ایجاد می‌کنند که هر نام‌ فایل حتی آنکه شامل فاصله‌ها، کاراکترهای TAB ، یا سطرهای جدید ‌باشد، می‌تواند پردازش شود.


CategoryShell

پرسش و پاسخ 8 (آخرین ویرایش ‎ 2011-05-26 13:31:47 ‎ توسط sbl-eh4-rp1)

نظرات 0 + ارسال نظر
ایمیل شما بعد از ثبت نمایش داده نخواهد شد