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 ، یا سطرهای جدید باشد، میتواند پردازش شود.
پرسش و پاسخ 8 (آخرین ویرایش 2011-05-26 13:31:47 توسط sbl-eh4-rp1)