উপসর্গ / প্রত্যয় দিয়ে কীভাবে নতুন নামকরণ করবেন?


98

mv original.filename new.original.filenameআসল ফাইলের নামটি টাইপ না করে কীভাবে করব ?

আমি কল্পনা করব এমন কিছু mv -p=new. original.filenameবা সম্ভবত mv original.filename new.~বা যা কিছু করতে সক্ষম হব - তবে man mv/ info mvপৃষ্ঠাগুলি দেখার পরে আমি এর মতো কিছুই দেখতে পাচ্ছি না ।

অবশ্যই, আমি এটি করতে একটি শেল স্ক্রিপ্ট লিখতে পারি, তবে এটির জন্য কোনও বিদ্যমান কমান্ড / পতাকা নেই?

উত্তর:


125

বাশ এবং 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

ধন্যবাদ, এটি সর্বোত্তম সমাধান বলে মনে হচ্ছে - ksh এর সাথেও কাজ করে।
পিটার বুফটন

29
এটি যা করে না তা হ'ল ওয়াইল্ড কার্ড সহ কাজ। এটি হ'ল ডিরেক্টরিতে "ইকো {, নতুন" ব্যবহার করে একটি, বি, সি ফাইল যুক্ত একটি ডিরেক্টরিতে ab * "তালিকাটি" অ্যাবসি নিউ। * "পাওয়া যায় (কারণ ব্রেস প্রসারণের মাধ্যমে ফাইলের নাম জেনারেশন ওয়াইল্ড কার্ডের অক্ষর প্রসারিত করার আগে ঘটে - কমপক্ষে অনুসারে)
জোনাথন লেফলার

কয়েক মাস যাবত আমি কেবল বেসিক শেল কার্যকারিতা ব্যবহার করে এই জাতীয় সমাধান খুঁজছি ... আমি এমন সহজ কিছু নিয়ে আসিনি, অনেক ধন্যবাদ!
ফ্ল্যাঙ্ক

ব্রেস প্রসারণ :-) রেফারেন্সের জন্য ধন্যবাদ আমি ঠিক কী খুঁজছিলাম!
পিম হ্যাজব্রোক

4
আমি উদাহরণ পছন্দ। আমি এখন আমার মধ্যাহ্নভোজের সময় বাসকিন রবিন্সে যাওয়ার মুডে অনুভব করছি।
শ্রীধর সারনোবাত

158

আপনি rename(1)কমান্ডটি ব্যবহার করতে পারেন :

rename 's/(.*)$/new.$1/' original.filename

সম্পাদনা: যদি renameউপলভ্য না হয় এবং আপনার একাধিক ফাইলের নাম পরিবর্তন করতে হয় তবে শেল স্ক্রিপ্টিং এর জন্য সংক্ষিপ্ত এবং সহজ হতে পারে। উদাহরণস্বরূপ, বর্তমান ডিরেক্টরিতে সমস্তটির নতুন নামকরণ *.jpgকরতে prefix_*.jpg:

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;

এই উইকএন্ডে গ্রাফাইটটি ইনস্টল করা হয়েছে এবং তাদের একটি পদক্ষেপ রয়েছে যা মূলত ("উদাহরণটি প্রত্যয় মুছে ফেলতে কনফার্ট ফোল্ডারে সমস্ত *। নমুনা ফাইলগুলি অনুলিপি করুন")। তাদের পক্ষে বাস্তব অলস, তবে rename 's/(.*).example/$1/' *.exampleআমাকে টেডিয়াম থেকে বাঁচিয়েছে।
কনরাড.ডিয়ান

4
এটি এখন পর্যন্ত সেরা উত্তর।
Lifeisfoo

4
আমি মনে করি না এই দৃশ্যে আপনার প্রথম প্রয়োজন $। ঠিক's/(.*)/new.$1/'
বুদ্ধিমানের

4
renameকমান্ডটি আমার RHEL 6 মেশিনে কাজ করে না। এই কমান্ডের বিভিন্ন সংস্করণ আছে? for ... doneআমার জন্য কাজ করেন।
রোবস

25

লুপের জন্য একটি তৈরি করে আপনি একটি ইউনিক্স সামঞ্জস্যপূর্ণ একাধিক ফাইলের নাম (ওয়াইল্ডকার্ড ব্যবহার করে) অর্জন করতে পারেন:

for file in *; do
  mv $file new.${file%%}
done

7
এর মধ্যে পার্থক্য কী এবং এর মধ্যে সাইমন লেহম্যান উত্তর দিয়েছেন ?
পিটার বুফটন

4
এটি দুর্দান্ত কাজ করে। কি ${file%%}করি? কেবল $ {ফাইল} এর মতোই বলে মনে হচ্ছে
সিডমিট্রা

আমি ious {ফাইল %% about সম্পর্কেও কৌতূহলী
লুকাস বুস্তামন্তে

10

আমি লোককে একটি renameকমান্ড উল্লেখ করতে দেখেছি , তবে এটি ইউনিক্স সিস্টেমে নিয়মিতভাবে পাওয়া যায় না (যেমন লিনাক্স সিস্টেমগুলির বিপরীতে, বলুন বা সাইগউইন - যার উভয়টিতেই নাম বদলে একটি স্ক্রিপ্টের পরিবর্তে কার্যকর করা যায়) is এই সংস্করণটির renameমোটামুটি সীমাবদ্ধ কার্যকারিতা রয়েছে:

rename from to file ...

তা পরিবর্ত থেকে সঙ্গে ফাইলের নাম অংশ থেকে , এবং উদাহরণ man পৃষ্ঠা দেওয়া হল:

rename foo foo0 foo? foo??

এটি foo1 কে foo01, এবং foo10 থেকে foo010 ইত্যাদির নামকরণ করে etc.

আমি পার্ল স্ক্রিপ্ট নামে একটি স্ক্রিপ্ট ব্যবহার করি 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

ধন্যবাদ, আমি যদি দ্বিতীয় উত্তরটি গ্রহণ করতে পারি তবে এটি হবে। আমি এমন কিছু হিসাবে একটি স্ট্যান্ডার্ড কমান্ড চেয়েছিলাম যা আমি ব্যবহার করতে পারি তার কিছুতেই কেবল কাজ করবে তবে আমি এই স্ক্রিপ্টটি আমার ঘন ঘন ব্যবহার করা মেশিনগুলিতে রাখতে পারি এবং এটি এখনও সহায়ক হবে।
পিটার বুটন

জেমস ওং বলছেন আর্চ লিনাক্সের জন্য, আপনি শুধু ডাউনলোড করুন এর মাধ্যমে এই স্ক্রিপ্ট ইনস্টল পারে pacmanব্যবহার করছে: pacman -Sy perl-rename। তারপরে আপনার বাশার্কে এটির সাথে একটি নাম যুক্ত করুন:alias rename='perl-rename'
জোনাথন লেফলার

"" থেকে "থেকে" থেকে "যদি খালি স্ট্রিং হয়, যেমন আপনি প্রতিটি ফাইলের
নামের সাথে

4
@ ট্রয়সিফ - '.htmlফাইলের নামের সাথে সংযুক্ত করতে, ব্যবহার করুন 's/$/.html/'- ফাইলের নামের যে কোনও জায়গা থেকে অপসারণ করতে tmp, ব্যবহার করুন 's/tmp//g'( tmpসর্বত্র কিছুই সহিত সন্ধান করুন এবং প্রতিস্থাপন করুন)।
জোনাথন লেফলার


2

যদি এটি কোনও পরিবর্তনের জন্য উন্মুক্ত থাকে তবে আপনি উপসর্গের পরিবর্তে প্রত্যয় ব্যবহার করতে পারেন। তারপরে আপনি মূল ফাইল নামটি পেতে এবং প্রত্যয় যুক্ত করতে ট্যাব-সমাপ্তি ব্যবহার করতে পারেন।

অন্যথায়, এটি এমভি কমান্ড দ্বারা সমর্থিত এমন কিছু নয়। একটি সাধারণ শেল স্ক্রিপ্ট যদিও সামলাতে পারে।


প্রায়শই আমি উভয়ই চাই, তবে প্রাথমিকভাবে উপসর্গ - যেমন আপনি বলেছেন, ট্যাব সমাপ্তি প্রত্যয়কে পরিচালনা করতে পারে।
পিটার বুটন

2

আমি জানি এখানে দুর্দান্ত উত্তর আছে তবে প্রত্যয় যুক্ত করার সময় আমি ফাইলের নাম এক্সটেনশানগুলি হ্যান্ডেল করার কোনও রেফারেন্স পাইনি।

আমার wavফাইল এক্সটেনশনের আগে একটি ফোল্ডারে সমস্ত ফাইলের '_en' প্রত্যয় যুক্ত করা দরকার ।

যাদু এখানে: %.*

for filename in *.wav; do mv $filename ${filename%.*}_en.wav; done;

আপনার যদি বিভিন্ন ফাইল এক্সটেনশান পরিচালনা করতে হয় তবে এই উত্তরটি দেখুন। কিছুটা স্বজ্ঞাত।


1

আমার ক্ষেত্রে আমার কাছে একটি গ্রুপের ফাইল রয়েছে যা তাদের সাথে কাজ করার আগে আমার নতুন নামকরণ করা দরকার। প্রতিটি ফাইলের গ্রুপে নিজস্ব ভূমিকা আছে এবং এর নিজস্ব প্যাটার্ন রয়েছে।

ফলস্বরূপ আমার কাছে পুনরায় নাম কমান্ডের একটি তালিকা রয়েছে:

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

1

বাল্কের ফাইলগুলির নাম বদল স্ক্রিপ্ট

#!/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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.