كيفية صفر من لوحة الأرقام في ملف أسماء باش ؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

ما هي أفضل طريقة باستخدام باش لإعادة تسمية الملفات في شكل:

(foo1, foo2, ..., foo1300, ..., fooN)

مع صفر-مبطن أسماء الملفات:

(foo00001, foo00002, ..., foo01300, ..., fooN)
هل كانت مفيدة؟

المحلول

في حالة N ليس بداهة ثابت:

 for f in foo[0-9]*; do mv $f `printf foo%05d ${f#foo}`; done

نصائح أخرى

انها ليست نقية باش, ولكن أسهل بكثير مع rename الأمر:

rename 's/\d+/sprintf("%05d",$&)/e' foo*

كان أكثر تعقيدا في الحالة التي يكون فيها أسماء الملفات قد postfix وكذلك بادئة.أنا أيضا في حاجة إلى تنفيذ الطرح على عدد من اسم الملف.

على سبيل المثال, أردت foo56.png لتصبح foo00000055.png.

آمل أن يساعد هذا إذا كنت تفعل شيئا أكثر تعقيدا.

#!/bin/bash

prefix="foo"
postfix=".png"
targetDir="../newframes"
paddingLength=8

for file in ${prefix}[0-9]*${postfix}; do
  # strip the prefix off the file name
  postfile=${file#$prefix}
  # strip the postfix off the file name
  number=${postfile%$postfix}
  # subtract 1 from the resulting number
  i=$((number-1))
  # copy to a new name with padded zeros in a new folder
  cp ${file} "$targetDir"/$(printf $prefix%0${paddingLength}d$postfix $i)
done

على oneline الأوامر التي تستخدم هذا:

ls * | cat -n | while read i f; do mv "$f" `printf "PATTERN" "$i"`; done

نمط يمكن أن تكون على سبيل المثال:

  • إعادة تسمية مع زيادة العداد: %04d.${f#*.} (الحفاظ على الأصلي امتداد الملف)
  • إعادة تسمية مع زيادة العداد مع البادئة: photo_%04d.${f#*.} (الحفاظ على تمديد الأصلي)
  • إعادة تسمية مع زيادة العداد و تغيير امتداد jpg: %04d.jpg
  • إعادة تسمية مع زيادة العداد مع بادئة ملف basename: photo_$(basename $f .${f#*.})_%04d.${f#*.}
  • ...

يمكنك تصفية ملف إعادة تسمية مع على سبيل المثال ls *.jpg | ...

المتاحة لديك متغير f هذا هو اسم الملف i هذا هو العداد.

بالنسبة لسؤالك حق الأمر:

ls * | cat -n | while read i f; do mv "$f" `printf "foo%d05" "$i"`; done

نقية باش ، أي العمليات الخارجية الأخرى من 'mv':

for file in foo*; do
  newnumber='00000'${file#foo}      # get number, pack with zeros
  newnumber=${newnumber:(-5)}       # the last five characters
  mv $file foo$newnumber            # rename
done

التالية سوف نفعل ذلك:

for ((i=1; i<=N; i++)) ; do mv foo$i `printf foo%05d $i` ; done

تحرير: تغير استخدام ((i=1,...)) شكرا mweerden!

هنا حل سريع يفترض ثابت طول بادئة (بك "foo") و ثابت طول الحشو.إذا كنت بحاجة إلى مزيد من المرونة ، ربما هذا من شأنه على الأقل أن تكون نقطة انطلاق مفيدة.

#!/bin/bash

# some test data
files="foo1
foo2
foo100
foo200
foo9999"

for f in $files; do
    prefix=`echo "$f" | cut -c 1-3`        # chars 1-3 = "foo"
    number=`echo "$f" | cut -c 4-`         # chars 4-end = the number
    printf "%s%04d\n" "$prefix" "$number"
done

الحل محل الأرقام ، في كل مكان في سلسلة

for f in * ; do
    number=`echo $f | sed 's/[^0-9]*//g'`
    padded=`printf "%04d" $number`
    echo $f | sed "s/${number}/${padded}/";
done

يمكنك محاولة بسهولة لأنه يطبع فقط تحويل أسماء الملفات (الملفات لا يتم تنفيذ عمليات).

التفسير:

حلقات من خلال قائمة الملفات

حلقة: for f in * ; do ;done, ، يسرد كافة الملفات و يمر كل اسم الملف كما $f متغير حلقة الجسم.

الاستيلاء على عدد من سلسلة

مع echo $f | sed نحن الأنابيب متغير $f إلى sed البرنامج.

في الأمر sed 's/[^0-9]*//g', الجزء [^0-9]* مع التعديل ^ يقول لتتناسب مع الآخر من رقم 0-9 (وليس العدد) ثم إزالته مع استبدال فارغة //.لماذا لا مجرد إزالة [a-z]?لأن اسم الملف يمكن أن تحتوي على النقاط وشرطات.... الخلذلك ، نحن في غزة كل شيء, ليس هذا هو عدد والحصول على رقم.

المقبل, نحن تعيين نتيجة number متغير.تذكر أن عدم وضع مسافات في المهمة مثل number = …, لأن تحصل على سلوك مختلف.

نحن تعيين نتيجة تنفيذ أمر إلى متغير, التفاف الأمر مع backtick الرموز `.

صفر الحشو

الأمر printf "%04d" $number يتغير شكل رقم 4 أرقام و يضيف الأصفار إذا كان الرقم يحتوي على أقل من 4 أرقام.

استبدال عدد من الصفر مبطن عدد

نستخدم sed مرة أخرى مع استبدال الأوامر مثل s/substring/replacement/.تفسير المتغيرات لدينا ، ونحن استخدام علامات الاقتباس المزدوجة و بديل لدينا المتغيرات في هذا الطريق ${number}.


السيناريو أعلاه يطبع فقط تحويل أسماء لذا دعونا نفعل الفعلية تسمية الوظيفة:

for f in *.js ; do
    number=`echo $f | sed 's/[^0-9]*//g'`
    padded=`printf "%04d" $number`
    new_name=`echo $f | sed "s/${number}/${padded}/"`
    mv $f $new_name;
done

نأمل أن يكون هذا يساعد شخص ما.

قضيت عدة ساعات إلى هذا الرقم.

إلى اليسار-لوحة الأرقام في أسماء الملفات:

$ ls -l
total 0
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:24 010
-rw-r--r-- 1 victoria victoria 0 Mar 28 18:09 050
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:23 050.zzz
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:24 10
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:23 1.zzz

$ for f in [0-9]*.[a-z]*; do tmp=`echo $f | awk -F. '{printf "%04d.%s\n", $1, $2}'`; mv "$f" "$tmp"; done;

$ ls -l
total 0
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:23 0001.zzz
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:23 0050.zzz
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:24 010
-rw-r--r-- 1 victoria victoria 0 Mar 28 18:09 050
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:24 10

تفسير

for f in [0-9]*.[a-z]*; do tmp=`echo $f | \
awk -F. '{printf "%04d.%s\n", $1, $2}'`; mv "$f" "$tmp"; done;
  • ملاحظة backticks: `echo ... $2}\` (مائل, \, على الفور أعلاه فقط انشقاقات أن بطانة واحدة أكثر من اثنين من خطوط القراءة)
  • في حلقة البحث عن الملفات التي يتم يدعى أرقام مع حروف الأبجدية ملحقات: [0-9]*.[a-z]*
  • صدى هذا الملف ($f) أن تمر عليه awk
  • -F. : awk فاصل حقل فترة (.):إذا المتطابقة ، يفصل بين أسماء الملفات كما حقلين ($1 = عدد ؛ $2 = ملحق)
  • تنسيق مع printf:طباعة الحقل الأول ($1, عدد جزءا) 4 أرقام (%04d) ، ثم طباعة هذه الفترة ، ثم طباعة الحقل الثاني ($2:التمديد) كسلسلة (%s).كل ذلك تم تعيينه $tmp متغير
  • وأخيرا نقل الملف المصدر ($f) إلى الملف الجديد ($tmp)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top