كيف يمكنني إعادة تسمية الملفات بسهولة مع بيرل؟

StackOverflow https://stackoverflow.com/questions/1836563

  •  11-09-2019
  •  | 
  •  

سؤال

لدي الكثير من الملفات التي أحاول إعادة تسميتها، حاولت إجراء تعبير منتظم لتتناسب معها، ولكن حتى أنه حصلت على عالقة على الملفات المسماة مثل:

اسم الملف 01.

اسم الملف 100.

اسم الملف 02.

اسم الملف 03.

إلخ، أود أن أضيف "0" (صفر)، وراء أي من الملف أقل من 100، مثل هذا:

اسم الملف 001.

اسم الملف 100.

اسم الملف 002.

اسم الملف 003.

الأقرب الذي وصلت إليه بقدر ما كان مطابقا لهم يستخدمون هذا البحث، DEPE D | فرز |. GREP '[1-9] [0-9] $' ومع ذلك لا يمكنني معرفة كيفية استبدالها. شكرا مقدما على أي مساعدة يمكنك أن تقدم لي. ايم على centos إذا كان ذلك من أي مساعدة، كل هذا يجري عبر SSH.

هل كانت مفيدة؟

المحلول

perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'

مبالغة قليلا ربما، لكنها تفعل ما يطلب.

نصائح أخرى

find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e' 

أو شيء من هذا القبيل، المقدمة

  1. لديك جنو تجد و gnu xargs (ل -print0 و -0)
  2. لديك الأداة المساعدة "إعادة تسمية" التي تأتي مع بيرل
  3. هناك مجموعة واحدة فقط من الأرقام في اسم الملف. إذا كان هناك أكثر من واحد، فأنت بحاجة إلى القيام بشيء ما باستخدام Regex لجعله يطابق الرقم الذي تريد إعادة تهيئة الرقم فقط.

هل هذا شيء لمرة واحدة؟ إذا كان الأمر كذلك، فسوف أقترح شيئا قد يبدو أن العديد من المبرمجين هنا:

أنابيب إخراج الأمر الخاص بك (find -type d | sort -r | grep ' [1-9][0-9]$') إلى ملف واستخدام محرر مع بعض البحث العالمي / استبدال السحر لإنشاء برنامج نصي يقوم بإعادة تسمية.

ثم رمي بعيدا البرنامج النصي.

هناك القليل من الضجة والصدفة الصغيرة التي ستنتهي بها إطلاق النار على نفسك في المقدمة من خلال إجراء بعض المحاولات الذكية (ولكن بشكل غير مناسب) إيقاف تشغيل بطانة واحدة في الأعشاب الضارة على ملفاتك.

تشغيل أمرين، في هذا الترتيب:

$ rename 's/File Name (\d)$/File Name 0$1/' *
$ rename 's/File Name (\d\d)$/File Name 0$1/' *

أول واحد يلمع كل شيء أقل من 10 ويعيد صفر. المرء الثاني يعيد كل شيء أقل من 100 وإعداد صفر. يجب أن تكون النتيجة ثلاثة أرقام لجميع أسماء الملفات.

في دبيان، يعمل بشكل جيد مع إعادة تسمية، تم اختباره مع 300 ملف.

 perl -e 'map `touch door$_.txt`, 1..300;'
 rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt

أظن MMV. هو صديقك هنا.

يمكنك أن تفعل شيئا باستخدام بيرل أو روبي.

ضع كل هذه الملفات في نفس الدليل

dirlisting = DIR.entries('.')

dirListing.each do |file| 
 num = file.match(/\d+$/).to_i
 if num < 100
   find the position where start the number, with index and inject the 0 there.
 end
end
use strict;
use File::Copy;

my @files = glob 'File*Name*';

foreach my $filename (@files) {
    if ($filename =~ m`^.*File.*Name.*?(\d+)`) {
        my $number = $1;
        next if ($number > 99);
        rename $filename, sprintf("FileName%03d",$number);
    }
}

إذا كان لديك جهاز التحكم عن بعد

for i in File*; 
do 
    case "${i##* }" in  [0-9][0-9] ) 
      echo  mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;; 
    esac; 
done

إزالة "صدى" للقيام بإعادة تسمية الفعلية

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top