نحوه تغییر نام گروه های پرونده ها به نام پرونده های عددی در Linux – CloudSavvy IT


شاتر استوک / استرپون

آیا می خواهید مجموعه ای از فایلها را به ترتیب عددی (1.pdf ، 2.pdf ، 3.pdf ، …) در لینوکس تغییر نام دهید؟ این را می توان با برخی از سناریوهای سبک انجام داد و این مقاله به شما نشان می دهد که چگونه این کار را انجام دهید.

نام پرونده های عددی

معمولاً ، وقتی یک فایل PDF را با استفاده از برخی سخت افزارها (تلفن همراه ، اسکنر PDF ویژه) اسکن می کنیم ، نام فایل چیزی مشابه را می خواند. 2020_11_28_13_43_00.pdf. بسیاری دیگر از سیستم های نیمه خودکار نام پرونده های مشابهی را براساس تاریخ و زمان تولید می کنند.

گاهی اوقات ممکن است پرونده حاوی نام برنامه مورد استفاده یا سایر اطلاعات باشد مانند DPI قابل استفاده (نقطه در اینچ) یا اندازه کاغذ اسکن شده.

هنگامی که فایل های PDF را از منابع مختلف با یکدیگر ترکیب می کنید ، قراردادهای نامگذاری پرونده بسیار متفاوت است و ممکن است ایده خوبی باشد که آنها را روی یک نام پرونده عددی (یا عددی) استاندارد کنید.

این مورد در مورد سایر دامنه ها و مجموعه پرونده ها نیز اعمال می شود. به عنوان مثال ، دستورالعمل ها یا مجموعه عکس های شما ، نمونه های داده ، سیستم های نظارت خودکار تولید شده ، پرونده های ورود به سیستم آماده برای تهیه نسخه پشتیبان ، مجموعه ای از پرونده های SQL برای مهندس پایگاه داده و معمولاً تمام داده های جمع آوری شده از منابع مختلف با طرح های مختلف نامگذاری.

تغییر نام دسته ای پرونده ها به نام پرونده های عددی

در لینوکس ، تغییر نام سریع مجموعه ای از فایلها با نام فایلهای کاملاً متفاوت ، به ترتیب عددی آسان است. “آسان” در اینجا به معنی “آسان برای پیاده سازی” است: مشکل تغییر نام دسته ای پرونده ها به شماره های عددی برای رمزگذاری در خود پیچیده است: تحقیق ، ایجاد و آزمایش اسکریپت oneliner زیر 3-4 ساعت طول کشید. بسیاری از دستورات دیگر آزمایش شده ، همه محدودیت هایی داشتند که من می خواستم از آنها جلوگیری کنم.

لطفا توجه داشته باشید که هیچ ضمانتی داده نمی شود و ارائه نمی شود و این کد “همانطور که هست” ارائه می شود. لطفا قبل از شروع تحقیقات خود را انجام دهید. همانطور که گفته شد ، من آن را با موفقیت در برابر پرونده هایی با نویسه های خاص مختلف و همچنین بیش از 50k پرونده بدون از دست دادن پرونده آزمایش کردم. من همچنین پرونده ای با نام را بررسی کردم 'a'$'n''a.pdf' که حاوی یک خط جدید است.

if [ ! -r _e -a ! -r _c ]; then echo 'pdf' > _e; echo 1 > _c ;find . -name "*.$(cat _e)" -print0 | xargs -0 -I{} bash -c 'mv -n "{}" $(cat _c).$(cat _e);echo $[ $(cat _c) + 1 ] > _c'; rm -f _e _c; fi

بیایید ابتدا به چگونگی عملکرد نگاه کنیم و سپس دستور را تجزیه و تحلیل کنیم. ما یک دایرکتوری با هشت پرونده ایجاد کرده ایم که همه آنها کاملا متفاوت نامگذاری شده اند ، با این تفاوت که پسوند آنها مطابقت دارد و یکسان است .pdf. سپس دستور بالا را اجرا کنید:

تغییر نام دسته ای پرونده ها به نام پرونده های عددی در Linux

نتیجه این بود که 8 پرونده به 1.pdf ، 2.pdf ، 3.pdf و … تغییر نام دادند ، گرچه قبل از آن نام آنها کاملا جبران شده بود.

این دستور فرض می کند که شما هیچ موردی ندارید 1. pdf به x.pdf نام پرونده هنوز اگر این کار را انجام دهید ، می توانید این پرونده ها را به یک مجموعه جداگانه منتقل کنید echo 1 به یک عدد بزرگتر برای تغییر نام پرونده های باقیمانده با یک جابجایی مشخص داده شده و سپس دو دایرکتوری را دوباره با هم ادغام کنید.

لطفاً همیشه مراقب باشید که هیچ پرونده ای را نادیده نگیرید و همیشه بهتر است قبل از به روزرسانی هر کاری سریع پشتیبان تهیه کنید.

بیایید دستور را با جزئیات بررسی کنیم. این می تواند با افزودن به شما کمک کند تا ببینید چه خبر است -t گزینه برای xargs که به ما امکان می دهد ببینیم چه چیزی در پشت صحنه اتفاق می افتد:

xargs با گزینه -t به ما اجازه می دهد ببینیم که در طول فرآیند تغییر نام چه اتفاقی می افتد

برای شروع ، این دستور از دو فایل کوچک موقتی (به نام) استفاده می کند و _ ° С) به عنوان ذخیره گاه موقت. در ابتدا از oneliner می سازد بررسی ایمنی با کمک if بیانیه برای اطمینان از اینکه هر دو و _ ° С پرونده ها وجود ندارد اگر فایلی با این نام وجود داشته باشد ، اسکریپت ادامه نخواهد یافت.

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

اولین مورد این است که اگر متغیری را در ابتدای oneliner صادر کنید و بعداً از همان متغیر استفاده کنید ، اگر اسکریپت دیگری از همان متغیر استفاده کند (از جمله این اسکریپت که بیش از یک بار در همان دستگاه اجرا می شود) ، این اسکریپت یا این یکی می تواند متأثر شدن. در هنگام تغییر نام در بسیاری از پرونده ها بهتر است از چنین تداخلی جلوگیری شود!

دوم این بود سارقین در ترکیب با bash -v به نظر می رسد محدودیتی در پردازش متغیرهای داخل وجود دارد bash -c خط فرمان. حتی تحقیقات گسترده آنلاین نیز راه حل عملی ارائه نداده است. بنابراین سرانجام از یک پرونده کوچک استفاده کردم _ ° С که پیشرفت را حفظ می کنند.

آیا پسوندی است که ما به دنبال آن می گردیم و استفاده می کنیم ، و _ ° С شمارنده ای است که با هر بار تغییر نام به طور خودکار افزایش می یابد. echo $[ $(cat _c) + 1 ] > _c کد با نشان دادن پرونده با ، از این امر مراقبت می کند cat، یک عدد اضافه کنید و آن را دوباره بنویسید.

این دستور همچنین از بهترین روش ممکن برای پردازش کاراکترهای خاص با نام پرونده استفاده می کند ، به جای خاتمه استاندارد خط جدید ، یعنی خاتمه صفر. شخصیت. این توسط -print0 گزینه برای findو توسط -0 گزینه xargs.

دستور find همه پرونده های دارای پسوند را همانطور که در آن مشخص شده جستجو می کند پرونده (ایجاد شده توسط echo 'pdf' > _e تیم می توانید این پسوند را به هر پسوند دیگری که می خواهید تغییر دهید ، اما لطفاً آن را با پیشوند دوره اضافه نکنید. این نکته قبلاً در بعداً گنجانده شده است *.$(cat _e) -name مشخص کننده به find.

وقتی find همه پرونده ها را پیدا کرد و آنها را ارسال کرد – خاتمه یافت تا سارقین، سارقین با استفاده از شمارنده پرونده ها را یکی یکی تغییر می دهد (_ ° С) و همان پرونده با پسوندها () برای دریافت محتویات هر دو پرونده ، به سادگی cat از یک دستور اجرا شده توسط یک خط زیر استفاده می شود.

mv از دستور move استفاده می کند -n برای جلوگیری از رونویسی هر پرونده ای که از قبل موجود است. در آخر ، با پاک کردن دو پرونده موقت ، آنها را تمیز می کنیم.

اگرچه هزینه استفاده از دو پرونده حالت و زیر پوسته های انشعابات می تواند محدود باشد ، اما این کار برخی از هزینه های اضافی را به اسکریپت اضافه می کند ، به خصوص هنگام کار با مقدار زیادی پرونده.

انواع مختلفی از راه حل های مشابه برای حل همین مشکل بصورت آنلاین وجود دارد و بسیاری از آنها در ایجاد یک راه حل کاملاً کارآمد تلاش کرده و ناکام مانده اند. بسیاری از راه حل ها هرگونه عوارض جانبی مانند استفاده را فراموش کرده اند ls بدون مشخص کردن --color=never، که می تواند منجر به تجزیه هگزادسیمال در هنگام استفاده از کدگذاری رنگ در دایرکتوری شود.

با این حال ، راه حل های دیگر نتوانستند پرونده ها را با فاصله ، خطوط جدید و نویسه های خاص به عنوان “” به درستی پردازش کنند. به همین دلیل این ترکیب است find ... -print0 ... | xargs -0 ... معمولاً نشان داده شده و ایده آل است (هر دو پیدا کردم و سارقین مدیریت ها کاملاً به این واقعیت اشاره دارند).

در حالی که من عملکردم را یک راه حل کامل یا نهایی نمی دانم ، اما به نظر می رسد که با استفاده از بسیاری از راه حل های دیگر کمک قابل توجهی می کند find و رشته های خاتمه یافته ارائه می دهد حداکثر سازگاری نام فایل و تجزیهو همچنین داشتن چند چیز خوب دیگر مانند توانایی پرسیدن شروع جبران، و کاملاً باشید باش متولد.

لذت بردن!


منبع: khabar-mehman.ir

دیدگاهتان را بنویسید

Comment
Name*
Mail*
Website*