اجرای یک دستو ربر روی یک سری فایل
|
2011-01-24, 12:09 AM,
ارسال : #1
|
|||
|
|||
اجرای یک دستو ربر روی یک سری فایل
سلام
من یه سوالی داشتم من یه فایل خاصی رو دارم که باهاش یه تصویر رو می شه دیکد کرد این طوری mycaom filename که mycaom همون فایل من است و filename اسم تصویر من. اینطوری اون تصویر دیکد میشه ( خواستم منظورم رو برسونم کارم چیه) حالا این تصاویر من خیلی زیاد هستن و با اسم های مختلف میشه کاری کرد که یه جوری دستور mycaom روی تمامی فایل های یه فولدر اجرا بشه؟ چون تعدا فایل های اون فولدر بالای 1000 تا است و من نمی تونم هر بار دستور بالا رو دستی اجرا کنم در ترمینال تشکر از شما |
|||
2011-01-24, 12:49 AM,
ارسال : #2
|
|||
|
|||
پاسخ: اجرای یک دستو ربر روی یک سری فایل
کد : find -type f -exec mycaom {} \; http://hedayatvk.blogspot.com http://hedayatvk.wordpress.com |
|||
2011-01-24, 10:50 AM,
ارسال : #3
|
|||
|
|||
پاسخ: اجرای یک دستو ربر روی یک سری فایل
متوجه نشدم
ميشه بگيد دستور بالا چي مي كنه؟ چطور فرمان من رو روي همه فايل ها اجرا مي كنه؟ |
|||
2011-01-24, 07:17 PM,
ارسال : #4
|
|||
|
|||
پاسخ: اجرای یک دستو ربر روی یک سری فایل
شما وارد شاخهی مورد نظر بشین و اجرا کنید (این رو یادم رفت بگم که دستوری که گفتم فرضش اینه که توی شاخهی هدف اجرا شده؛ البته میتونید به عنوان پارامتر اول شاخهی مقصد رو بدین مثلا find /folan/directory -type f ) دستور زیر رو:
find -type f میبینین همهی فایلهای اون شاخه و زیرشاخهها رو لیست میکنه. پارامتر exec هم میگه یه دستور رو روی فایل پیدا شده اجرا کنه. جزئیات بیشتر رو یا دوستان میگن یا توی man find یا info find پیدا کنید. http://hedayatvk.blogspot.com http://hedayatvk.wordpress.com |
|||
2011-01-24, 08:13 PM,
ارسال : #5
|
|||
|
|||
Re: پاسخ: اجرای یک دستو ربر روی یک سری فایل
hedayat نویسنده : آقا به نظر من به دوستان (به ظاهر تازه کار) که سوالاتی راجع به بعضی ابزار های یونیکس میپرسند جواب هایی بدهیم که بعد ها که حرفه ای تر شدند بگویند دمش گرم آن کسی که آنوقت این را گفت. مثلا بجای exec همیشه از execdir استفاده کنیم. <!-- m --><a class="postlink" href="http://www.gnu.org/software/findutils/manual/html_mono/find.html#Multiple-Files">http://www.gnu.org/software/findutils/m ... iple-Files</a><!-- m --> کلا در راه حل بالا در صورتیکه نام فایل ها حاوی بعضی کاراکتر های معنی دار برای Shell و علی الخصوص کاراکتر فاصله باشد اتفاقات عجیب و غریبی میفتد پس چرا این کار را نکنیم؟ کد : find -type f -print0 | xargs -r0 sh -c 'mycaom "$@"' mycaom <!-- m --><a class="postlink" href="http://www.gnu.org/software/findutils/manual/html_mono/find.html#Invoking-the-shell-from-xargs">http://www.gnu.org/software/findutils/m ... from-xargs</a><!-- m --> همیشه پیشگام ... همیشه بهترین ... همیشه فدورا http://persian-foss-legal.blogspot.com http://www.tesla-sanat.com |
|||
2011-01-24, 11:42 PM,
ارسال : #6
|
|||
|
|||
پاسخ: Re: پاسخ: اجرای یک دستو ربر روی یک سری فایل
در مورد سوالی که ایشون داشتند، مشکل امنیتی از بابت اسامی فایلها وجود نداره. در واقع کمترین خطر امنیتی که توی find هست مربوط میشه به اسم فایلها که اونهم طبق صورت مسئله بعیده. هیچ مشکلی هم از نظر وجود فاصله یا هر کاراکتر دیگه توی اسم فایل نیست. (تنها جایی که این خطر وجود داره در صورتی که دستوری که توی exec نوشته میشه خودش کاراکترها رو تفصیر کنه، مثلا:
کد : find -exec sh -c "something {}" \; کد : find -exec sh -c 'something "{}"' \; ولی برنامههایی که پارامترهاشون اسم فایلها هستند مثل مثالی که ایشون زده برای دیکود کردن، مشکلی ندارند. اون سری هم یه مثال براتون زدم. مشکل اصلی که برای find ذکر شده مربوط به تغییراتیه که ممکنه در حین عمل find توی فایل سیستم رخ بده؛ که در این زمینه استفاده از xargs مثل بالا هم همون مشکل رو داره (مشکل هنگام اجرای find به وجود میاد). البته، کسی هم که با چنین مشکلی درگیر باشه باید کار حساسی داشته باشه که در اون حالت باید حسابی در زمینه امنیت کار کرده باشه. البته ممنون به خاطر تذکرتون، باعث شد مطالب جدیدی یاد بگیرم. با اینحال، برای این سوال خاص به نظر میاد همون exec- مشکل خاصی نداره؛ یا دیگه فوقش استفاده از execdir- اونم البته نه به خاطر اسم فایلها. و البته اینها، بازم همون طور که گفتم، مربوط به وقتیه که این دستورها رو جای حساسی اجرا کنید؛ وگرنه مسلما کسی وسط عکسهای شخصی شما فایلی با اسم خاص درست نمیکنه اونم با این فرض که شما چنان دستور مشکلداری (که همونطور که گفتم حالتهای خیلی خاصی به وجود میاد) بذاره. http://hedayatvk.blogspot.com http://hedayatvk.wordpress.com |
|||
2011-01-25, 10:31 AM,
ارسال : #7
|
|||
|
|||
پاسخ: Re: پاسخ: اجرای یک دستو ربر روی یک سری فایل
قبول دستوری که اونجا گذاشتم خیلی افراطیه چون اجازه Redirection رو هم میده که در کار ایشون نیاز نیست. ولی مشکل اصلی در اینه که در یونیکس و شبه-یونیکس هر کاراکتری (همه رقم) در نام فایل پذیرفته است بجر کاراکتر NULL کد 0. در حالت معمولی دستور find نام چیز هایی که پیدا کرده رو با کارامتر newline جدامیکنه (که البته وجودش در نام خود فایل ها مجازه) و البته برای Shell معنی پایان یک خط دستور و شروع یک خط دستور دیگه رو داره. یک راه حل سریع و امنیت متوسط میتونه این باشه که -print0 رو به find بدی تا نام فایل های پیدا شده رو با کاراکتر NULL که اصلا در نام فایل مجاز نیست جدابکنه. بعد --null هم به xargs بدی تا بفهمه آرگومانها چطور جداشدن از هم.
کد : find . -type f -print0 | xargs --null mycaom این دستور نه سخت تره و نه طولانی تر و خیلی بهتره. همیشه پیشگام ... همیشه بهترین ... همیشه فدورا http://persian-foss-legal.blogspot.com http://www.tesla-sanat.com |
|||
2011-01-25, 01:22 PM,
ارسال : #8
|
|||
|
|||
پاسخ: Re: پاسخ: اجرای یک دستو ربر روی یک سری فایل
(<- این یعنی ما با هم دوستیم؛ و اصلا قصد دعوا ندارم، فقط میخوام از اطلاعات شما برای تکمیل اطلاعات خودم استفاده کنم. همونطور که بالا هم گفتم من تا حالا به مشکلات امنیتی find exec توجه نکرده بودم.)میگم مطمئنین بهتره؟ راستش حداقل چیزی که من از چیزایی که خوندم و تستهایی که کردم فهمیدم اینه که بهتر نمیشه. طبق اون چیزی که من فهمیدم، فقط بعضی جاها استفاده از xargs به جای exec/-execdir- لازم میشه چون میشه یه کارایی رو باهاش کرد که با اونها اصلا نمیشه؛ که دقیقش رو نخوندم ولی به نحوهی گذاشتن پارامترها برمیگشت. اما از نظر امنیتی به نظرم نیومد که بهتر از execها بشه؛ و حتی خطای امنیتی توی xargs راحتتره. مثلا find خودش خیلی خوب با کاراکترهای توی اسم فایل کنار میاد و تا وقتی دستور برنامهای مثل sh نباشه هیچ مشکلی پیش نمیاد.
http://hedayatvk.blogspot.com http://hedayatvk.wordpress.com |
|||
|