سؤال

كيف أفعل 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top