ইউনিক্সে প্যাটার্নের ভিত্তিতে একাধিক ফাইলের নাম পরিবর্তন করুন


248

একটি ডিরেক্টরিতে একাধিক ফাইল রয়েছে যা উপসর্গ দিয়ে শুরু হয় fgh, উদাহরণস্বরূপ:

fghfilea
fghfileb
fghfilec

উপসর্গ দিয়ে শুরু করতে আমি তাদের সকলের নাম পরিবর্তন করতে চাই jkl। পৃথকভাবে প্রতিটি ফাইলের নাম পরিবর্তনের পরিবর্তে এটি করার জন্য কি একক আদেশ রয়েছে?


1
এখানে চেক করুন: theunixshell.blogspot.com/2013/01/…
বিজয়

উত্তর:


289

বিভিন্ন উপায় আছে, কিন্তু ব্যবহার rename করা সম্ভবত সবচেয়ে সহজ হবে।

এর একটি সংস্করণ ব্যবহার করা rename:

rename 's/^fgh/jkl/' fgh*

rename( জুডি 2 কে এর উত্তর হিসাবে একই ) এর অন্য সংস্করণ ব্যবহার করে :

rename fgh jkl fgh*

উপরের কোনটি প্রয়োগ হয় তা দেখতে আপনার প্ল্যাটফর্মের ম্যান পৃষ্ঠাটি পরীক্ষা করা উচিত।


7
+1 এমনকি নাম পরিবর্তন সম্পর্কে জানতেন না ... এখন আমি এমভি এবং সেড দিয়ে লুপের জন্য ব্যবহার বন্ধ করতে পারি ... ধন্যবাদ!
বালফা

2
আপনি একটি ভিন্ন লিঙ্ক করা হয় renameতারপর আপনার জন্য সিনট্যাক্স দেখাচ্ছে unixhelp.ed.ac.uk/CGI/man-cgi?rename অন্যান্য অন্যতম
Hasturkun

7
সমস্ত * নিক্স সিস্টেমে উপস্থিত নেই। একের জন্য সর্বোচ্চ ওএস এক্সে নেই, এবং এটি পাওয়ার জন্য কোনও প্যাকেজও নেই। ম্যাকপোর্টসের দিকে তাকাতে হয়নি।
ডিএমকেকে --- প্রাক্তন মডারেটর বিড়ালছানা

6
AFAICT, renameএকটি লিনাক্স নির্দিষ্ট স্ক্রিপ্ট বা ইউটিলিটি বলে মনে হচ্ছে। আপনি যদি বহনযোগ্যতার বিষয়ে একেবারেই চিন্তা করেন তবে দয়া করে ব্যবহার sedএবং লুপগুলি বা একটি ইনলাইন পার্ল স্ক্রিপ্ট চালিয়ে যান ।
ডি.শ্যাওলি

32
brew install renameওএস এক্স এ :)
স্যাম

117

এইভাবে sedএবং mvনামকরণ করতে একসাথে ব্যবহার করা যেতে পারে:

for f in fgh*; do mv "$f" $(echo "$f" | sed 's/^fgh/jkl/g'); done

নীচের মতামত অনুসারে, যদি ফাইলের নামগুলির মধ্যে ফাঁকা স্থান থাকে, উদ্ধৃতিগুলিকে সাব-ফাংশনটি ঘিরে রাখা উচিত যা ফাইলগুলিতে সরাতে নামটি ফেরত দেয়:

for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done

1
খুব কাছে. নোট করুন যে আপনি কেবল fgh এর প্রথম সংঘটনটিই মেলাতে চান: 's / ^ fgh / jkl / g' (ক্যারেটটি সমস্ত পার্থক্য করে)।
স্টিফান202

2
কেবল নির্ভুলতার খাতিরে ... আপনার অর্থ "নামের শুরুতে fgh", "fgh এর প্রথম ঘটনা" নয়। / ^ fgh / "fghi" এর সাথে মিলবে তবে "efgh" নয়।
ডেভ শেরোহমান

@ স্টেফান, এটি আমার পক্ষ থেকে একটি টাইপো ছিল (এটি ঠিক করা)।
নিক

5
যদি আপনার "পুনরায় নামকরণ" করতে অ্যাক্সেস না থাকে তবে এটি দুর্দান্ত কাজ করে। আপনার ফাইলের নামগুলিতে শূন্যস্থান অন্তর্ভুক্ত থাকলে কোডটির জন্য উদ্ধৃতিগুলির প্রয়োজন হতে পারে। for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done
ডেভ নেলসন

1
কোট ফাইল এই তালিকা পুনঃনামকরনের একটি ত্রুটি নিক্ষেপ করা হবে ছাড়া @nik: touch fghfilea fghfileb fghfilec fghfile\ d। আমি দয়া করে @ ডেভেলসন মন্তব্যগুলি বিবেচনায় নেওয়ার পরামর্শ দিই।
লুইস্কুল 21 শে

75

নামকরণ প্রতিটি সিস্টেমে নাও থাকতে পারে। সুতরাং আপনার যদি এটি না থাকে তবে শ্যাশটি উদাহরণস্বরূপ ব্যাশ শেলটিতে ব্যবহার করুন

for f in fgh*; do mv "$f" "${f/fgh/xxx}";done

1
এই সমাধানে, sedকমান্ডের প্রয়োজন হয় না। @ নিকের উত্তরের চেয়ে এটি সহজ।
হালিল

xxx প্রতিস্থাপনের জন্য দাঁড়িয়ে? মূল পোস্টারটির ক্ষেত্রে এটি "জে কেএল"
হত

1
তাদের সবার পরিষ্কার সমাধান।
এমটি হেড

3
সম্ভবত আরও দৃhat়তার সাথে উল্লেখ করুন যে এটি বাশ এক্সটেনশন যা পসিক্সে shবা সাধারণত অন্যান্য শেলের মধ্যে নেই exist
ট্রিপলি

মিষ্টি - ইউনিক্স বিশ্বে অনেকগুলি অস্পষ্ট কোণ রয়েছে - এটি আগে কখনও দেখেনি।
wcochran

40

মিমভি ব্যবহার :

mmv "fgh*" "jkl#1"

1
বাহ, সমস্যাটি সমাধানের এটি একটি দুর্দান্ত এবং সহজ উপায়! মিমভের সাথে পরিচয় করিয়ে দিয়ে খুশি, ধন্যবাদ!
হেন্ডেকা

1
ধন্যবাদ !!! এর আগে কখনও এমএমভিয়ের কথা শুনিনি। সবেমাত্র ইনস্টল করা হয়েছে এবং এটি নিয়ে খেলছেন - সাধারণ, শক্তিশালী।
নিক রাইস

3
আপনি যদি ব্যাচটির পুনরায় নামকরণ করতে চান তবে পুনরাবৃত্তভাবে ;এর সাথে ব্যবহার করুন #1। উদাহরণ:mmv ";fgh*" "#1jkl#2"
আল্প

খুব মার্জিত সমাধান!
ফার্মেটের ছোট শিক্ষার্থী

1
ঠিক আমার যা প্রয়োজন ছিল। ' ' এর সাথে গোষ্ঠীগুলি ক্যাপচার করুন এবং তাদেরকে # 1, # 2, ... EX সহ: এমএমভিভি "আমার শো এপি 1080p। *" " আমার শো । # 1 # 2" = আমার.শো.001.avi
লন্ডি

20

এটি করার অনেকগুলি উপায় রয়েছে (এগুলি সবগুলি একরকম সিস্টেমে কাজ করবে না):

  • ls | cut -c4- | xargs -I§ mv fgh§ jkl§

    Convenient আপনি যে কোনও সুবিধাজনক বলে প্রতিস্থাপন করতে পারেন। আপনি এটি find -execদিয়েও করতে পারেন তবে এটি বেশ কয়েকটি সিস্টেমে সূক্ষ্মভাবে আচরণ করে, তাই আমি সাধারণত এড়াতে পারি

  • for f in fgh*; do mv "$f" "${f/fgh/jkl}";done

    অপরিশোধিত তবে তারা যেমন বলে তেমন কার্যকর

  • rename 's/^fgh/jkl/' fgh*

    বাস্তব সুন্দর, তবে পুনর্নবীকরণ বিএসডি-তে উপস্থিত নেই, এটি আফিকের সবচেয়ে সাধারণ ইউনিক্স সিস্টেম।

  • rename fgh jkl fgh*

  • ls | perl -ne 'chomp; next unless -e; $o = $_; s/fgh/jkl/; next if -e; rename $o, $_';

    আপনি যদি পার্ল ব্যবহার করার জন্য জেদ করেন তবে আপনার সিস্টেমে কোনও নাম পরিবর্তন হয় না, আপনি এই দৈত্যটি ব্যবহার করতে পারেন।

এর মধ্যে কয়েকটি কিছুটা বিশৃঙ্খলাযুক্ত এবং তালিকাটি সম্পূর্ণ দূরে, তবে আপনি সমস্ত ইউনিক্স সিস্টেমের জন্য আপনি এখানে যা চান তা পাবেন।


2
আমি এই ধরনের দানবকে ভালবাসি!
লেফাকির

হ্যাঁ,
পার্লের


এখানে আপনার পার্ল দৈত্যটি আপনার ফাইলের নামগুলিতে ফাঁকা থাকলে নির্দ্বিধায় কাজ করতে পারে to
মিরলি 30'18

13
rename fgh jkl fgh*

6
আমার মেশিনে এটি "বেওয়ারওয়ার্ড" এফএইজি "ত্রুটিটি তৈরি করে না তবে" কড়াকড়ি সাবস "ব্যবহার করা হয় না (আইভাল 1) লাইন 1 তে। '
স্টেফান202

@ স্টেফান202, আপনার মেশিনটি কী?
নিক

উবুন্টু 8.10 (পার্ল ভি 5.10.0 / 2009-06-26)
স্টেফান202

@ Stephan202 আমারও একই সমস্যা আছে, আপনি কি সমাধান করেছেন? (7 বছর পরে)

1
@ হোসনেম: দুঃখিত, সত্যিই মনে করতে পারছি না। (ছুটির কারণে ধীর জবাব।)
স্টেফান202

8

ব্যবহার find, xargsএবং sed:

find . -name "fgh*" -type f -print0 | xargs -0 -I {} sh -c 'mv "{}" "$(dirname "{}")/`echo $(basename "{}") | sed 's/^fgh/jkl/g'`"'

এটি @ নিকের সমাধানের চেয়ে জটিল তবে এটি পুনরাবৃত্তভাবে ফাইলগুলির নাম পরিবর্তন করতে দেয়। উদাহরণস্বরূপ, কাঠামো,

.
├── fghdir
│   ├── fdhfilea
│   └── fghfilea
├── fghfile\ e
├── fghfilea
├── fghfileb
├── fghfilec
└── other
    ├── fghfile\ e
    ├── fghfilea
    ├── fghfileb
    └── fghfilec

এতে রূপান্তরিত হবে,

.
├── fghdir
│   ├── fdhfilea
│   └── jklfilea
├── jklfile\ e
├── jklfilea
├── jklfileb
├── jklfilec
└── other
    ├── jklfile\ e
    ├── jklfilea
    ├── jklfileb
    └── jklfilec

এটি দিয়ে কাজ করার মূল চাবিকাঠিটি xargsহল xargs থেকে শেলটি চাওয়া


1
আমি এই জাতীয় কিছু পোস্ট করতে যাচ্ছিলাম, তবে ডান কমান্ডটি পেতে আমার এক ঘন্টা লেগেছিল
জুয়ান মেন্ডেস

3

পার্লের পুনর্নামকরণ স্ক্রিপ্টটি ইনস্টল করতে :

sudo cpan install File::Rename

স্টেফান202 এর উত্তরে মন্তব্যগুলিতে উল্লেখ করা হয়েছে এমন দুটি নাম রয়েছে। দেবিয়ান ভিত্তিক ডিস্ট্রোসের পার্লের নতুন নাম রয়েছে । রেডহাট / আরপিএম ডিস্ট্রোসের সি নামকরণ রয়েছে
ওএস এক্সের একটি ডিফল্টরূপে ইনস্টলড নেই (কমপক্ষে 10.8 এ), উইন্ডোজ / সাইগউইনও নেই।


3

কমান্ড-লাইন গ্রোভি ব্যবহার করে এটি করার একটি উপায় এখানে রয়েছে:

groovy -e 'new File(".").eachFileMatch(~/fgh.*/) {it.renameTo(it.name.replaceFirst("fgh", "jkl"))}'

2

সোলারিসে আপনি চেষ্টা করতে পারেন:

for file in `find ./ -name "*TextForRename*"`; do 
    mv -f "$file" "${file/TextForRename/NewText}"
done

লুপের ভিতরে ফাইলের নাম উদ্ধৃত করার জন্য আপনি অর্ধ পয়েন্ট পাবেন তবে for file in $(find)মূলত ত্রুটিযুক্ত এবং উদ্ধৃতি দিয়ে সংশোধন করা যায় না। তাহলে findআয় ./file name with spacesআপনি একটি পাবেন forলুপ উপর ./file, name, with, এবং spacesএবং লুপ ভিতরে উদ্ধৃত সাহায্য করবে (এমনকি প্রয়োজন হতে) কোন পরিমাণ।
ট্রিপলি

2
#!/bin/sh

#replace all files ended witn .f77 to .f90 in a directory

for filename in *.f77
do 
    #echo $filename
    #b= echo $filename | cut -d. -f1
    #echo $b    
    mv "${filename}" "${filename%.f77}.f90"    
done

2

এই স্ক্রিপ্টটি আমার পক্ষে ডিরেক্টরি / ফাইলের নামগুলির সাথে পুনরায় নামকরণের জন্য কাজ করেছে যা সম্ভবত শ্বেতস্থান রয়েছে:

find . -type f -name "*\;*" | while read fname; do
    dirname=`dirname "$fname"`
    filename=`basename "$fname"`
    newname=`echo "$filename" | sed -e "s/;/ /g"`
    mv "${dirname}/$filename" "${dirname}/$newname"
done

sedএই উদাহরণে ;স্থানের সাথে সমস্ত উপস্থিতি প্রতিস্থাপন করে এমন অভিব্যক্তিটি লক্ষ্য করুন । এটি অবশ্যই নির্দিষ্ট প্রয়োজন অনুসারে প্রতিস্থাপন করা উচিত।


অনেক ধন্যবাদ ! দুর্দান্ত স্ক্রিপ্ট
ওয়াল্টার শ্রাবমায়ের

1

ব্যবহার StringSolver যা প্রক্রিয়া উদাহরণ দ্বারা টুলস (Windows & লিনাক্স ব্যাশ):

filter fghfilea ok fghreport ok notfghfile notok; mv --all --filter fghfilea jklfilea

এটি প্রথমে উদাহরণগুলির উপর ভিত্তি করে একটি ফিল্টার গণনা করে , যেখানে ইনপুটটি ফাইলের নাম এবং আউটপুট (ঠিক আছে এবং নোটক, স্বেচ্ছামূলক স্ট্রিং)। যদি ফিল্টারটিতে --auto বিকল্প থাকে বা এই কমান্ডের পরে একাই আহ্বান করা হয় তবে এটি একটি ফোল্ডার okএবং ফোল্ডার তৈরি করতে পারেnotok এবং ফাইলগুলিকে যথাক্রমে ধাক্কা দেয়।

তারপরে ফিল্টারটি ব্যবহার করে, mvকমান্ডটি একটি আধা-স্বয়ংক্রিয় পদক্ষেপ যা মডিফায়ার - আউটো দিয়ে স্বয়ংক্রিয় হয়ে যায়। - ফিল্টারকে ধন্যবাদ পূর্ববর্তী ফিল্টারটি ব্যবহার করে, এটি থেকে একটি ম্যাপিং পাওয়া fghfileaযায় jklfileaএবং তারপরে এটি সমস্ত ফিল্টার করা ফাইলগুলিতে প্রয়োগ করে।


অন্যান্য এক-লাইন সমাধান

একই করার অন্যান্য সমতুল্য উপায় (প্রতিটি লাইন সমতুল্য), যাতে আপনি এটি করার জন্য আপনার পছন্দসই পদ্ধতি বেছে নিতে পারেন।

filter fghfilea ok fghreport ok notfghfile notok; mv --filter fghfilea jklfilea; mv
filter fghfilea ok fghreport ok notfghfile notok; auto --all --filter fghfilea "mv fghfilea jklfilea"
# Even better, automatically infers the file name
filter fghfilea ok fghreport ok notfghfile notok; auto --all --filter "mv fghfilea jklfilea"

মাল্টি-স্টেপ সলিউশন

কমান্ডগুলি ভাল কার্য সম্পাদন করছে কিনা তা সাবধানতার সাথে খুঁজে পেতে, আপনি নিম্নলিখিতগুলি টাইপ করতে পারেন:

filter fghfilea ok
filter fghfileb ok
filter fghfileb notok

এবং যখন আপনি বিশ্বাস করেন যে ফিল্টারটি ভাল, প্রথম পদক্ষেপটি সম্পাদন করুন:

mv fghfilea jklfilea

আপনি যদি পরীক্ষা করতে চান এবং আগের ফিল্টারটি ব্যবহার করতে চান তবে টাইপ করুন:

mv --test --filter

যদি রূপান্তর আপনি যা চান তা না হয় (উদাহরণস্বরূপ এমন কি আপনি mv --explainদেখেন যে কিছু ভুল হয়েছে), আপনি mv --clearমুভিং ফাইলগুলি পুনরায় চালু করতে টাইপ করতে পারেন বা আরও উদাহরণ যুক্ত করতে পারেন mv input1 input2যেখানে ইনপুট 1 এবং ইনপুট 2 অন্যান্য উদাহরণ

আপনি যখন আত্মবিশ্বাসী হন, কেবল টাইপ করুন

mv --filter

এবং voilà! সমস্ত নামকরণ ফিল্টার ব্যবহার করে সম্পন্ন হয়।

অস্বীকৃতি: আমি একাডেমিক উদ্দেশ্যে তৈরি এই কাজের সহ-লেখক। শিগগিরই এখানে ব্যাশ-উত্পাদন বৈশিষ্ট্যও থাকতে পারে।


1

রুবিতে এটি করা খুব সহজ (আমার ম্যাকে) ছিল। এখানে 2 টি উদাহরণ রয়েছে:

# for your fgh example. renames all files from "fgh..." to "jkl..."
files = Dir['fgh*']

files.each do |f|
  f2 = f.gsub('fgh', 'jkl')
  system("mv #{f} #{f2}")
end

# renames all files in directory from "021roman.rb" to "021_roman.rb"
files = Dir['*rb'].select {|f| f =~ /^[0-9]{3}[a-zA-Z]+/}

files.each do |f|
  f1 = f.clone
  f2 = f.insert(3, '_')
  system("mv #{f1} #{f2}")
end


1

ভর ফাইলের নামকরণের আমার সংস্করণ:

for i in *; do
    echo "mv $i $i"
done |
sed -e "s#from_pattern#to_pattern#g” > result1.sh
sh result1.sh

আমি স্ক্রিপ্টটি চালানোর আগে যাচাই করার ক্ষমতাটি পছন্দ করি
ardochhigh

এটি স্পেস, কোট, বা অন্যান্য শেল মেটাচার্যাক্টরযুক্ত ফাইলের নামগুলিতে দুর্দান্তভাবে বিরতি দেয়।
ট্রিপলি

1

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

#!/usr/bin/perl

# Copyright (c) 2014 André von Kugland

# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.

$help_msg =
"rename.pl, a script to rename files in batches, using Perl
           expressions to transform their names.
Usage:
    rename.pl [options] FILE1 [FILE2 ...]
Where options can be:
    -v                      Verbose.
    -vv                     Very verbose.
    --apply                 Really apply modifications.
    -e PERLCODE             Execute PERLCODE. (e.g. 's/a/b/g')
    --from-charset=CS       Source charset. (e.g. \"iso-8859-1\")
    --to-charset=CS         Destination charset. (e.g. \"utf-8\")
    --unicode-normalize=NF  Unicode normalization form. (e.g. \"KD\")
    --basename              Modifies only the last element of the path.
";

use Encode;
use Getopt::Long;
use Unicode::Normalize 'normalize';
use File::Basename;
use I18N::Langinfo qw(langinfo CODESET);

Getopt::Long::Configure ("bundling");

# ----------------------------------------------------------------------------------------------- #
#                                           Our variables.                                        #
# ----------------------------------------------------------------------------------------------- #

my $apply = 0;
my $verbose = 0;
my $help = 0;
my $debug = 0;
my $basename = 0;
my $unicode_normalize = "";
my @scripts;
my $from_charset = "";
my $to_charset = "";
my $codeset = "";

# ----------------------------------------------------------------------------------------------- #
#                                        Get cmdline options.                                     #
# ----------------------------------------------------------------------------------------------- #

$result = GetOptions ("apply" => \$apply,
                      "verbose|v+" => \$verbose,
                      "execute|e=s" => \@scripts,
                      "from-charset=s" => \$from_charset,
                      "to-charset=s" => \$to_charset,
                      "unicode-normalize=s" => \$unicode_normalize,
                      "basename" => \$basename,
                      "help|h|?" => \$help,
                      "debug" => \$debug);

# If not going to apply, then be verbose.
if (!$apply && $verbose == 0) {
  $verbose = 1;
}

if ((($#scripts == -1)
  && (($from_charset eq "") || ($to_charset eq ""))
  && $unicode_normalize eq "")
  || ($#ARGV == -1) || ($help)) {
  print $help_msg;
  exit(0);
}

if (($to_charset ne "" && $from_charset eq "")
  ||($from_charset eq "" && $to_charset ne "")
  ||($to_charset eq "" && $from_charset eq "" && $unicode_normalize ne "")) {
  $codeset = langinfo(CODESET);
  $to_charset = $codeset if $from_charset ne "" && $to_charset eq "";
  $from_charset = $codeset if $from_charset eq "" && $to_charset ne "";
}

# ----------------------------------------------------------------------------------------------- #
#         Composes the filter function using the @scripts array and possibly other options.       #
# ----------------------------------------------------------------------------------------------- #

$f = "sub filterfunc() {\n    my \$s = shift;\n";
$f .= "    my \$d = dirname(\$s);\n    my \$s = basename(\$s);\n" if ($basename != 0);
$f .= "    for (\$s) {\n";
$f .= "        $_;\n" foreach (@scripts);   # Get scripts from '-e' opt. #
# Handle charset translation and normalization.
if (($from_charset ne "") && ($to_charset ne "")) {
  if ($unicode_normalize eq "") {
    $f .= "        \$_ = encode(\"$to_charset\", decode(\"$from_charset\", \$_));\n";
  } else {
    $f .= "        \$_ = encode(\"$to_charset\", normalize(\"$unicode_normalize\", decode(\"$from_charset\", \$_)));\n"
  }
} elsif (($from_charset ne "") || ($to_charset ne "")) {
    die "You can't use `from-charset' nor `to-charset' alone";
} elsif ($unicode_normalize ne "") {
  $f .= "        \$_ = encode(\"$codeset\", normalize(\"$unicode_normalize\", decode(\"$codeset\", \$_)));\n"
}
$f .= "    }\n";
$f .= "    \$s = \$d . '/' . \$s;\n" if ($basename != 0);
$f .= "    return \$s;\n}\n";
print "Generated function:\n\n$f" if ($debug);

# ----------------------------------------------------------------------------------------------- #
#                 Evaluates the filter function body, so to define it in our scope.               #
# ----------------------------------------------------------------------------------------------- #

eval $f;

# ----------------------------------------------------------------------------------------------- #
#                  Main loop, which passes names through filters and renames files.               #
# ----------------------------------------------------------------------------------------------- #

foreach (@ARGV) {
  $old_name = $_;
  $new_name = filterfunc($_);

  if ($old_name ne $new_name) {
    if (!$apply or (rename $old_name, $new_name)) {
      print "`$old_name' => `$new_name'\n" if ($verbose);
    } else {
      print "Cannot rename `$old_name' to `$new_name'.\n";
    }
  } else {
    print "`$old_name' unchanged.\n" if ($verbose > 1);
  }
}

2
নোট করুন যে কেবলমাত্র লিঙ্ক-উত্তরগুলি নিরুৎসাহিত করা হয়েছে, এসও উত্তরগুলি সমাধানের সন্ধানের শেষ পয়েন্ট হওয়া উচিত (বনাম। রেফারেন্সগুলির মধ্যে আরও একটি স্টপওভার, যা সময়ের সাথে সাথে বাসি হয়ে যায়)। রেফারেন্স হিসাবে লিঙ্কটি রেখে এখানে দয়া করে একা একা সংক্ষিপ্তসার বিবেচনা করুন।
ক্লিওপাত্রা

@ ক্লিওপেট্রার পূর্বাভাস অনুসারে , লিঙ্কটি অর্জন করেছেstale over time
y2k-shubham


0

এটি আমার জন্য রেজিপ্সপ ব্যবহার করে কাজ করেছে:

আমি চেয়েছিলাম ফাইলগুলি এইরকম নামকরণ করা হোক:

file0001.txt -> 1.txt
ofile0002.txt -> 2.txt 
f_i_l_e0003.txt -> 3.txt

usig the [আজ | _] + 0 * ([0-9] +। ) রিজেক্সেপ যেখানে ([0-9] +। ) একটি নামের কমান্ডে ব্যবহার করার জন্য একটি গ্রুপ সাবস্ট্রিং

ls -1 | awk 'match($0, /[a-z|\_]+0*([0-9]+.*)/, arr) { print   arr[0]  " "  arr[1] }'|xargs  -l mv

উত্পাদন:

mv file0001.txt 1.txt
mv ofile0002.txt 2.txt
mv f_i_l_e0003.txt 3.txt

আরেকটি উদাহরণ:

file001abc.txt -> abc1.txt
ofile0002abcd.txt -> abcd2.txt 

ls -1 | awk 'match($0, /[a-z|\_]+0*([0-9]+.*)([a-z]+)/, arr) { print   arr[0]  " "  arr[2] arr[1] }'|xargs  -l mv

উত্পাদন:

  mv file001abc.txt abc1.txt
  mv ofile0002abcd.txt abcd2.txt 

সতর্কতা, সাবধান।


0

আমি সমস্ত স্ক্রিপ্ট .mkv ফাইল অনুসন্ধান করার জন্য এই স্ক্রিপ্টটি লিখেছি i আপনি এটি আপনার প্রয়োজন অনুসারে কাস্টমাইজ করতে পারেন। ভবিষ্যতে আপনার কিছু উল্লেখ করার দরকার থাকলেই আমি ফাইলের ডিরেক্টরি থেকে ফাইল ডিরেক্টরি, এক্সটেনশন, ফাইলের নাম পাওয়া যেমন অন্য কিছু যুক্ত করেছি।

find . -type f -name "*.mkv" | while read fp; do 
fd=$(dirname "${fp}");
fn=$(basename "${fp}");
ext="${fn##*.}";
f="${fn%.*}";
new_fp="${fd}/${f}.avi"
mv -v "$fp" "$new_fp" 
done;

0

একটি চালানোর জন্য একটি জেনেরিক স্ক্রিপ্ট sedফাইল তালিকায় অভিব্যক্তি (সম্মিলন sedসমাধান সঙ্গে renameসমাধান ):

#!/bin/sh

e=$1
shift

for f in $*; do
    fNew=$(echo "$f" | sed "$e")
    mv "$f" "$fNew";
done

স্ক্রিপ্টটি একটি sedএক্সপ্রেশন এবং তারপরে ফাইলের কোনও তালিকা পেরিয়ে দাও, ঠিক যেমনটির সংস্করণ rename:

script.sh 's/^fgh/jkl/' fgh*

0

আপনি স্ক্রিপ্টের নীচেও ব্যবহার করতে পারেন। টার্মিনালে চালানো খুব সহজ ...

// একসাথে একাধিক ফাইলের নাম পরিবর্তন করুন

for file in  FILE_NAME*
do
    mv -i "${file}" "${file/FILE_NAME/RENAMED_FILE_NAME}"
done

উদাহরণ: -

for file in  hello*
do
    mv -i "${file}" "${file/hello/JAISHREE}"
done

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