كيفية إعادة التسمية باستخدام البادئة/اللاحقة؟
سؤال
كيف أفعل mv original.filename new.original.filename
دون إعادة كتابة اسم الملف الأصلي؟
أتخيل أن أكون قادرًا على القيام بشيء مثل mv -p=new. original.filename
او ربما mv original.filename new.~
أو أيًا كان - لكني لا أستطيع رؤية أي شيء كهذا بعد النظر إليه man mv
/ info mv
الصفحات.
بالطبع، يمكنني كتابة برنامج نصي لشل للقيام بذلك، ولكن ألا يوجد أمر/علامة موجودة لذلك؟
المحلول
في Bash وzsh يمكنك القيام بذلك باستخدام توسيع هدفين.يؤدي هذا ببساطة إلى توسيع قائمة العناصر الموجودة بين الأقواس.على سبيل المثال:
# echo {vanilla,chocolate,strawberry}-ice-cream
vanilla-ice-cream chocolate-ice-cream strawberry-ice-cream
لذلك يمكنك القيام بإعادة التسمية الخاصة بك على النحو التالي:
mv {,new.}original.filename
حيث يمتد هذا إلى:
mv original.filename new.original.filename
نصائح أخرى
هل يمكن استخدام تسمية (1) الأمر:
rename 's/(.*)$/new.$1/' original.filename
تعديل: إذا تسمية غير متوفرة لديك لإعادة تسمية أكثر من ملف واحد، وقذيفة البرمجة يمكن أن يكون حقا قصيرة وبسيطة لهذا الغرض. على سبيل المثال، لإعادة تسمية كل <م> .jpg وبادئة _ م> .jpg وفي الدليل الحالي:
for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;
ويمكنك تحقيق يونكس متوافقة إعادة تسمية الملفات المتعددة (باستخدام أحرف البدل) عن طريق إنشاء لحلقة:
for file in *; do
mv $file new.${file%%}
done
ورأيت الناس تذكر أمر rename
، ولكن لم يكن متوفرا بشكل روتيني على أنظمة يونكس (على العكس من أنظمة لينكس، مثلا، أو سيغوين - على كل منها، إعادة تسمية غير قابل للتنفيذ بدلا من السيناريو). هذا الإصدار من rename
لديه وظائف محدودة إلى حد ما:
rename from to file ...
وهي تحل محل <م> من م> جزء من أسماء الملفات مع إلى م>، والمثال المذكور في الصفحة الرجل:
rename foo foo0 foo? foo??
وهذه تسمية foo1 إلى foo01، وfoo10 إلى foo010، وما إلى ذلك.
وأنا استخدم برنامج نصي بيرل دعا rename
، التي حفرت أصلا من الطبعة الأولى الجمل كتاب، حوالي عام 1992، وامتدت بعد ذلك، لإعادة تسمية الملفات.
#!/bin/perl -w
#
# @(#)$Id: rename.pl,v 1.7 2008/02/16 07:53:08 jleffler Exp $
#
# Rename files using a Perl substitute or transliterate command
use strict;
use Getopt::Std;
my(%opts);
my($usage) = "Usage: $0 [-fnxV] perlexpr [filenames]\n";
my($force) = 0;
my($noexc) = 0;
my($trace) = 0;
die $usage unless getopts('fnxV', \%opts);
if ($opts{V})
{
printf "%s\n", q'RENAME Version $Revision: 1.7 $ ($Date: 2008/02/16 07:53:08 $)';
exit 0;
}
$force = 1 if ($opts{f});
$noexc = 1 if ($opts{n});
$trace = 1 if ($opts{x});
my($op) = shift;
die $usage unless defined $op;
if (!@ARGV) {
@ARGV = <STDIN>;
chop(@ARGV);
}
for (@ARGV)
{
if (-e $_ || -l $_)
{
my($was) = $_;
eval $op;
die $@ if $@;
next if ($was eq $_);
if ($force == 0 && -f $_)
{
print STDERR "rename failed: $was - $_ exists\n";
}
else
{
print "+ $was --> $_\n" if $trace;
print STDERR "rename failed: $was - $!\n"
unless ($noexc || rename($was, $_));
}
}
else
{
print STDERR "$_ - $!\n";
}
}
وهذا يسمح لك لإرسال أي بديل بيرل أو كتابة لغة بحروف لغة الأمر لتعيين أسماء الملفات. في المثال المحددة المطلوبة، وكنت استخدام:
rename 's/^/new./' original.filename
وأسهل طريقة لمعظم إعادة تسمية الملفات في الدليل هي:
ls | xargs -I fileName mv fileName fileName.suffix
إذا كان مفتوحا إلى تعديل، هل يمكن استخدام لاحقة بدلا من البادئة. ثم هل يمكن استخدام علامة التبويب الإنجاز للحصول على اسم الملف الأصلي وإضافة لاحقة.
وخلاف ذلك، لا هذا ليس شيئا معتمد من قبل الأمر mv. وهناك سيناريو قذيفة بسيطة يمكن التعامل مع ذلك.
في حالتي لدي مجموعة من الملفات التي تحتاج إلى إعادة تسمية قبل أن أتمكن من العمل معهم. كل ملف له دوره الخاص في مجموعة ولها نمطها الخاص.
وونتيجة لدي قائمة من إعادة تسمية أوامر من هذا القبيل:
f=`ls *canctn[0-9]*` ; mv $f CNLC.$f
f=`ls *acustb[0-9]*` ; mv $f CATB.$f
f=`ls *accusgtb[0-9]*` ; mv $f CATB.$f
f=`ls *acus[0-9]*` ; mv $f CAUS.$f
وحاول هذا أيضا:
f=MyFileName; mv $f {pref1,pref2}$f{suf1,suf2}
وهذا سوف ينتج كافة تركيبات مع البادئات واللاحقات:
pref1.MyFileName.suf1
...
pref2.MyFileName.suf2
وهناك طريقة أخرى لحل نفس المشكلة هو إنشاء الخرائط مجموعة وإضافة بادئة المراسل لكل نوع الملف كما هو موضح أدناه:
#!/bin/bash
unset masks
typeset -A masks
masks[ip[0-9]]=ip
masks[iaf_usg[0-9]]=ip_usg
masks[ipusg[0-9]]=ip_usg
...
for fileMask in ${!masks[*]};
do
registryEntry="${masks[$fileMask]}";
fileName=*${fileMask}*
[ -e ${fileName} ] && mv ${fileName} ${registryEntry}.${fileName}
done
والسائبة إعادة تسمية ملفات البرامج النصية باش
#!/bin/bash
# USAGE: cd FILESDIRECTORY; RENAMERFILEPATH/MultipleFileRenamer.sh FILENAMEPREFIX INITNUMBER
# USAGE EXAMPLE: cd PHOTOS; /home/Desktop/MultipleFileRenamer.sh 2016_
# VERSION: 2016.03.05.
# COPYRIGHT: Harkály Gergő | mangoRDI (https://wwww.mangordi.com/)
# check isset INITNUMBER argument, if not, set 1 | INITNUMBER is the first number after renaming
if [ -z "$2" ]
then i=1;
else
i=$2;
fi
# counts the files to set leading zeros before number | max 1000 files
count=$(ls -l * | wc -l)
if [ $count -lt 10 ]
then zeros=1;
else
if [ $count -lt 100 ]
then zeros=2;
else
zeros=3
fi
fi
# rename script
for file in *
do
mv $file $1_$(printf %0"$zeros"d.%s ${i%.*} ${file##*.})
let i="$i+1"
done