FASTRM(1) InterNetNews Documentation FASTRM(1)

fastrm - حذف سریع فهرستی از فایل‌ها

fastrm [-de] [-c|-cI] [-s|-sM] [-u|-uN] base-directory

دستور fastrm فهرستی از نام‌های فایل یا توکن‌های API ذخیره‌سازی را به صورت یک مورد در هر خط از ورودی استاندارد خود خوانده و آن‌ها را حذف می‌کند. توکن‌های API ذخیره‌سازی از طریق رابط SMcancel() حذف می‌شوند. fastrm فایل‌ها را به شکلی امن یا با در نظر گرفتن ملاحظات امنیتی حذف نمی‌کند، بلکه تا حد ممکن میان‌بُر می‌زند تا فایل‌ها را با بالاترین سرعت ممکن حذف کند. بنابراین هرگز نباید آن را روی دایرکتوری‌های دارای مجوز نوشتن همگانی (publicly writable) یا در هر محیط دیگری که ممکن است طرف متخاصمی بر ساختار دایرکتوری محل کار آن کنترل داشته باشد، اجرا کرد.

اگر نام یک فایل یک مسیر مطلق نباشد، نسبت به base-directory مشخص‌شده در خط فرمان، نسبی در نظر گرفته می‌شود. پارامتر base-directory باید یک مسیر مطلقِ ساده باشد (نباید شامل چندین اسلش متوالی یا ارجاع به دایرکتوری‌های ویژهٔ "." یا ".." باشد).

دستور fastrm طوری طراحی شده است که در صورت دریافت فهرستی مرتب‌شده از نام فایل‌ها به عنوان ورودی، از خط لولهٔ معمول "| xargs rm" سریع‌تر عمل کند. به عنوان مثال، fastrm معمولاً پیش از حذف فایل‌ها از یک دایرکتوری، با فراخوانی chdir(2) وارد آن می‌شود؛ این بدان معناست که اگر ورودی مرتب باشد، بیشتر نام‌های ارسال‌شده به unlink(2) نام‌های ساده خواهند بود. این امر می‌تواند سربار سیستم‌عامل ناشی از جستجوهای دایرکتوری (directory lookups) را به میزان قابل توجهی کاهش دهد.

دستور fastrm فرض می‌کند که ورودی آن معتبر است و فراخوانی unlink(2) برای هر نام فایلی که به آن داده می‌شود ایمن است. با این حال به عنوان یک اقدام احتیاطی، fastrm هنگام اجرا با دسترسی ریشه (root)، پیش از حذف با stat(2) بررسی می‌کند که نام فایل، مشخص‌کنندهٔ یک دایرکتوری نباشد. (در برخی سیستم‌عامل‌ها، کاربر root مجاز است دایرکتوری‌ها را حتی در صورت خالی نبودن unlink کند که این کار می‌تواند موجب خرابی سامانه فایل شود.)

اگر سرعت اهمیت دارد و ورودی صرفاً توکن‌های API ذخیره‌سازی نیست، ورودی fastrm همواره باید مرتب‌شده باشد -- یا حتی بهتر از آن، به همان ترتیبی باشد که نام فایل‌ها توسط find(1) خروجی داده می‌شوند. (این برنامه با ورودی مرتب‌نشده نیز به خوبی کار می‌کند، اما در آن حالت بعید است که از یک دستور سادهٔ "| xargs rm" سریع‌تر باشد.) مرتب‌سازی حتی ممکن است به دلیل اثرات حافظه پنهان (caching)، حذف توکن‌های API ذخیره‌سازی را نیز اندکی تسریع کند، چرا که مرتب‌سازی باعث می‌شود تمامی توکن‌های مربوط به یک روش ذخیره‌سازی خاص در کنار هم قرار گیرند.

بهینه‌سازی‌های مختلف دیگری را برای حذف فایل‌ها می‌توان با استفاده از گزینه‌ها فعال و/یا تنظیم کرد (زیر را ببینید). اینکه کدام گزینه‌ها بیشترین کارایی را خواهند داشت، به شدت به ساختار زیربنایی سامانه فایل، نحوه ذخیره و جستجوی دایرکتوری‌ها، و جزئیات پیاده‌سازی سیستم‌عامل (که اغلب مستندسازی اندکی دارند) بستگی دارد. هرچه سیستم‌عامل و سامانه فایل زیرین پیشرفته‌تر باشند، احتمال بیشتری وجود دارد که پیشاپیش معادل این بهینه‌سازی‌ها را به صورت درونی انجام دهند.

زمان فراخوانی chdir(2) توسط fastrm را کنترل می‌کند. اگر تعداد فایل‌هایی که قرار است از یک دایرکتوری مشخص unlink شوند حداقل I باشد، آن‌گاه fastrm پیش از unlink کردن آن فایل‌ها به آن دایرکتوری تغییر مسیر می‌دهد. در غیر این صورت، از مسیرهای مطلق یا یک نام مسیرِ نسبی به دایرکتوری جاری (هر کدام که احتمالاً کارآمدتر باشد) استفاده خواهد کرد. پارامتر I اختیاری است؛ اگر فقط -c مشخص شود، -c1 فرض می‌شود که باعث می‌شود fastrm همیشه پیش از فراخوانی unlink(2) دستور chdir را انجام دهد. مقدار پیش‌فرض -c3 است. از -c0 برای جلوگیری از هرگونه استفادهٔ fastrm از chdir(2) استفاده کنید.
هیچ فایلی را حذف نمی‌کند. در عوض، فهرستی از فایل‌هایی را که قرار است حذف شوند در خروجی استاندارد چاپ می‌کند. هر خط شامل یکی از موارد زیر است: دایرکتوری جاری fastrm در زمان انجام unlink و نام مسیر نسبی که به unlink(2) ارسال می‌شود به صورت دو فیلد که با فاصله و یک "/" از هم جدا شده‌اند؛ مسیر مطلق (به صورت یک فیلد منفرد) که به unlink(2) ارسال می‌شود؛ یا رشتهٔ "Token" و توکن API ذخیره‌سازی که حذف خواهد شد.
یک فایل ورودی خالی را به عنوان خطا در نظر می‌گیرد. این گزینه زمانی بیشترین کاربرد را دارد که fastrm آخرین بخش از یک خط لوله پس از یک دستور sort(1) پیشین باشد؛ تا اطمینان حاصل شود که در صورت شکست sort، دستور fastrm نیز با شکست مواجه می‌شود.
هنگامی که -s داده شود و تعداد فایل‌های قابل حذف در یک دایرکتوری بیشتر از M باشد، به جای حذف فایل‌ها به ترتیب مشخص‌شده، fastrm دایرکتوری را باز کرده و آن را می‌خواند و فایل‌ها را به ترتیبی که در دایرکتوری ظاهر می‌شوند، unlink می‌کند. در سیستم‌هایی با حافظه پنهان دایرکتوری اختصاصی برای هر فرایند (per-process directory cache) یا سیستم‌هایی که از جستجوی خطی برای یافتن فایل‌ها در دایرکتوری استفاده می‌کنند، این امر باید جستجوهای دایرکتوری را سریع‌تر کند. پارامتر M اختیاری است؛ اگر فقط -s مشخص شود، -s5 فرض می‌شود.

هنگامی که این گزینه فعال باشد، fastrm برای حذف فایل‌هایی که در دایرکتوری نمی‌بیند تلاشی نخواهد کرد، که در صورت حذف شدن قبلی اکثر فایل‌های هدف، ممکن است سرعت آن را به طور چشمگیری افزایش دهد. با این حال، استفاده از این گزینه مستلزم انجام کارهای درونی بیشتری توسط fastrm است و همچنین فرض می‌کند که ترتیب فهرست دایرکتوری با وجود فراخوانی‌های unlink(2) در بین فراخوانی‌های readdir(3) پایدار می‌ماند. این ممکن است در برخی از سامانه‌های فایل پیشرفته فرضی خطرناک باشد (و به طور کلی این گزینه تنها در سامانه‌های فایلی که از جستجوهای خطی بدون نمایه‌سازی برای یافتن فایل‌ها استفاده می‌کنند یا زمانی که اکثر فایل‌های قابل حذف پیشاپیش حذف شده‌اند مفید است).

این بهینه‌سازی به طور پیش‌فرض غیرفعال است.

مشخص کردن این گزینه تعهد می‌دهد که هیچ پیوند نمادینی (symbolic link) در درخت دایرکتوری که فایل‌ها از آن حذف می‌شوند وجود ندارد. این به fastrm اجازه می‌دهد تا در فراخوانی‌های chdir(2) خود بهینه‌سازی بیشتری اعمال کند؛ یعنی به جای استفاده همیشگی از مسیرهای مطلق، با استفاده از "../.." و مانند آن یک مسیر نسبی برای ارسال به chdir(2) بسازد. از آنجا که این کار تعداد جستجوهای دایرکتوری مورد نیاز در ساختارهای دایرکتوری عمیق و تودرتو را (مانند آنچه معمولاً توسط فضای ذخیره‌سازی سنتی news spool ایجاد می‌شود) کاهش می‌دهد، می‌تواند بهینه‌سازی چشمگیری باشد؛ اما در حضور پیوندهای نمادین به دایرکتوری‌ها، به شدت با شکست مواجه می‌شود.

هنگامی که -u داده شود، fastrm برای ساخت مسیرها حداکثر از N سطح از بخش‌های ".." استفاده خواهد کرد. مقدار N اختیاری است؛ اگر فقط -u مشخص شود، -u1 فرض می‌شود.

این بهینه‌سازی به طور پیش‌فرض غیرفعال است.

دستور fastrm گزینه‌های -a و -r را نیز می‌پذیرد که هیچ کاری انجام نمی‌دهند، جز اینکه به شما امکان می‌دهند عباراتی مانند "fastrm -usa"، "fastrm -usr" یا "fastrm -user" را وارد کنید. این‌ها اغلب مجموعه‌هایی راحت از گزینه‌ها برای استفاده هستند.

دستور fastrm در صورت نبود هیچ مشکلی با وضعیت صفر و در صورت بروز اشکال با وضعیت خروج ۱ خارج می‌شود. تلاش برای حذف فایلی که وجود ندارد، مشکل محسوب نمی‌شود.

دستور fastrm معمولاً توسط INN از طریق expirerm(8) با دستوری مانند زیر فراخوانی می‌شود:

fastrm -e <patharticles in inn.conf> < expire.list

برای فعال‌سازی همهٔ بهینه‌سازی‌ها و دیدن تأثیر حاصل از -s بر ترتیب حذف، از دستور زیر استفاده کنید:

fastrm -d -s -e -u <patharticles> < expire.list

اگر سامانه فایل شما از جستجوهای دایرکتوری نمایه‌شده برخوردار است، اما ساختار دایرکتوری بسیار تودرتویی دارید، ممکن است بخواهید از مجموعه‌ای از پرچم‌ها مانند زیر استفاده کنید:

fastrm -e -u3 <patharticles> < expire.list

تا اولویت اکید را به مسیرهای نسبی بدهید اما از readdir(2) برای مرتب کردن فراخوانی‌های unlink(2) استفاده نکنید.

ممکن است بخواهید expirerm(8) را ویرایش کنید تا پرچم‌های ارسال‌شده به fastrm را تغییر دهید.

دستور fastrm برای افزایش سرعت میان‌بُر می‌زند و توجهی به مسائل امنیتی ندارد؛ بنابراین از chdir(2) به شیوه‌ای امن استفاده نمی‌کند و اگر روی یک درخت فایل ساخته‌شده به شکل خاص یا درخت فایلی که در حین اجرای برنامه در حال تغییر است اجرا شود، می‌توان آن را فریب داد تا فایل‌هایی غیر از موارد مدنظر را حذف کند. بنابراین هرگز نباید از آن در دایرکتوری‌های دارای مجوز نوشتن همگانی (world-writable) یا هر دایرکتوری دیگری که ممکن است توسط یک مهاجم کنترل یا تغییر داده شود استفاده کرد.

دستور fastrm باز کردن زیرسیستم ذخیره‌سازی یا تلاش برای تجزیهٔ هرگونه فایل پیکربندی INN را تا زمانی که در فهرست فایل‌های قابل حذف با یک توکن مواجه نشود، به تعویق می‌اندازد. بنابراین امکان استفاده از fastrm در خارج از INN به عنوان یک برنامهٔ عمومی و سریع برای حذف فایل وجود دارد.

دستور fastrm در ابتدا توسط <kre@munnari.oz.au> نوشته شده است. این صفحه راهنما توسط Russ Allbery <eagle@eyrie.org> در قالب POD برای InterNetNews بازنویسی شده است.

expirerm(8).

2026-06-12 INN 2.7.4