লিনাক্সের ছোট হাতের অক্ষরে আমি কীভাবে সমস্ত ফোল্ডার এবং ফাইলগুলির নাম পরিবর্তন করব?


179

আমাকে পুনরাবৃত্তভাবে একটি সম্পূর্ণ ফোল্ডার গাছের নামকরণ করতে হবে যাতে কোনও বড় হাতের অক্ষর কোথাও না উপস্থিত হয় (এটি সি ++ উত্স কোড, তবে এটি বিবেচনা করা উচিত নয়)।

সিভিএস এবং সাবভারশন সংস্করণ নিয়ন্ত্রণ ফাইল / ফোল্ডারগুলিকে উপেক্ষা করার জন্য বোনাস পয়েন্ট। পছন্দসই উপায় হ'ল শেল স্ক্রিপ্ট, যেহেতু শেল যে কোনও লিনাক্স বাক্সে পাওয়া উচিত।

ফাইলটির নাম পরিবর্তন করার বিশদ সম্পর্কে কিছু বৈধ যুক্তি ছিল।

  1. আমি মনে করি একই ছোট ছোট নামগুলির ফাইলগুলি ওভাররাইট করা উচিত; এটি ব্যবহারকারীর সমস্যা। কেস-উপেক্ষা করা ফাইল সিস্টেমে চেক আউট করা হলে, এটি প্রথমটির সাথে ওভাররাইট করে।

  2. আমি এজেডের অক্ষরগুলি বিবেচনা করব এবং এজেডে রূপান্তর করব, অন্য সব কিছুই কেবল সমস্যার জন্য ডাকছে (কমপক্ষে উত্স কোড সহ)।

  3. একটি লিনাক্স সিস্টেমে বিল্ড চালানোর জন্য স্ক্রিপ্টটির প্রয়োজন হবে, তাই আমি মনে করি সিভিএস বা সাবভার্সন সংস্করণ নিয়ন্ত্রণ ফাইলগুলির পরিবর্তনগুলি বাদ দেওয়া উচিত। সর্বোপরি, এটি কেবল একটি স্ক্র্যাচ চেকআউট। হতে পারে একটি "এক্সপোর্ট" আরও উপযুক্ত appropriate


পূর্বে পোস্ট করা বাক্স থেকে পুরোপুরি বা সাধারণ কেসগুলির জন্য কয়েকটি সামঞ্জস্যের সাথে কাজ করবে তবে ব্যাচের পুনরায় নাম চালানোর আগে আপনি কিছু পরিস্থিতি বিবেচনায় নিতে চাইতে পারেন: ১. আপনার দুটি বা আরও বেশি নাম থাকলে কী হবে পথের শ্রেণিবিন্যাসের একই স্তরের যা কেবলমাত্র ক্ষেত্রে যেমন পৃথক ABCdef, abcDEFএবং aBcDeF? নাম পরিবর্তনের স্ক্রিপ্টটি বাতিল করা উচিত বা কেবল সতর্ক করা এবং চালিয়ে যেতে হবে? ২. ইউএস-এএসসিআইআই নামগুলির জন্য আপনি নিম্ন কেসটি কীভাবে সংজ্ঞায়িত করবেন? যদি এই জাতীয় নামগুলি উপস্থিত থাকতে পারে, তবে কি একবার চেক করে বাদ দেওয়া উচিত? ৩. যদি আপনি একটি নতুন নাম অপারেশন চালাচ্ছেন
মিহাই লিম্বান

উত্তর:


179

"rename"কমান্ডটি ব্যবহার করে একটি সংক্ষিপ্ত সংস্করণ :

find my_root_dir -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

ডিরেক্টরিগুলির আগে ফাইলগুলির নাম পরিবর্তন করা এবং ফাইলগুলি অ-বিদ্যমান ডিরেক্টরিগুলিতে স্থানান্তরিত করার চেষ্টা করা (যেমন: এর "A/A"মধ্যে "a/a") সমস্যা এড়ানো যায় ।

অথবা, ব্যবহার না করে আরও ভার্বোজ সংস্করণ "rename"

for SRC in `find my_root_dir -depth`
do
    DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'`
    if [ "${SRC}" != "${DST}" ]
    then
        [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" || echo "${SRC} was not renamed"
    fi
done

পুনশ্চ

পরেরটি মুভ কমান্ডের সাথে আরও নমনীয়তা দেয় (উদাহরণস্বরূপ "svn mv")।


36
পুনরায় নাম ব্যবহার করে পাশাপাশি 'y / AZ /
Az

3
সাবধান, উভয় সংস্করণ কোনও ক্ষেত্রে সংবেদনশীল ফাইল সিস্টেমে কাজ করবে না। আমার ক্ষেত্রে আমি thenদ্বারা বন্ধ-লাইনটি প্রতিস্থাপন করেছি (mv "${SRC}" "${DST}.renametmp" && mv "${DST}.renametmp" "${DST}") || echo "${SRC} was not renamed"
লোয়েকি

6
ফাঁকা ফাঁকা স্থান (কনটেক্সট: লিনাক্স, বাশ) সম্বলিত ফাইলগুলি সহ দ্বিতীয় পদ্ধতিটি আমার পক্ষে সঠিকভাবে কাজ করে নি।
ধীরে

4
নাম পরিবর্তনের শেষ সংস্করণটি ব্যবহার করে কোনও রেইজেক্সের দরকার নেই। পুরো কমান্ড হয়ে যায় find my_root_dir -depth -exec rename -c {} \;। আপনি যদি কেস-সংবেদনশীল ফাইল সিস্টেমের (উদাহরণস্বরূপ ম্যাক) তে থাকেন তবে নাম পরিবর্তন করতে অ্যাড-
এফ যোগ করুন

দ্বিতীয়টি কমান্ড -Tথেকে সরিয়ে সোলারিসে আমার পক্ষে কাজ করেছিল mv
হাম

261

ছোট এখনও আমি বেশ পছন্দ করি:

rename 'y/A-Z/a-z/' *

ওএস এক্স এর এইচএফএস + এর মতো সংবেদনশীল ফাইল সিস্টেমগুলিতে আপনি -fপতাকাটি যুক্ত করতে চাইবেন :

rename -f 'y/A-Z/a-z/' *

3
linux.icydog.net/rename.php :The renaming utility that comes by default with Ubuntu is a Perl program sometimes called prename
ঘুমন্ত

1
ধন্যবাদ, আমি এটি এইভাবে ব্যবহার করেছি $ সন্ধান করুন xargs 'y / AZ / az /' * এর নাম পরিবর্তন করেছে
রাশি

5
এটি ধরে নিয়েছে আপনার পার্লসের নাম পরিবর্তন হয়েছে, যা সর্বদা হয় না। উদাহরণস্বরূপ, আমার ডেবিয়ানের নাম সম্পূর্ণ আলাদা
ক্রিজিস্তফ ক্রেসো

10
আর্চ-তে, প্রোগ্রামটি বলা হয় perl-rename(এবং একই নামের একটি প্যাকেজ দ্বারা সরবরাহ করা হয়)
জায়েমার - মনিকা পুনরায় ইনস্টল করুন

3
"প্রদত্ত নাম" পুনরাবৃত্তি না হওয়ায় এটি প্রদত্ত সমস্যার উত্তর দেয় না।
সাইবলিক

89
for f in `find`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done

আপনার স্ক্রিপ্টটি চালানোর আগে দয়া করে একটি "mkdir -p A / B / C" করুন।
tzot

2
আপনার নাম পরিবর্তন করতে ইচ্ছুক ফাইলগুলির একটি তালিকা পেতে আপনি যে কমান্ড ব্যবহার করেন তা দিয়ে "সন্ধান করুন" প্রতিস্থাপন করা উচিত; উদাহরণস্বরূপ, "ls *। {C, CPP, H}"।
জেপেজেট

2
ওএস এক্সে কাজ করে না, কেবল ব্যবহারের তথ্য প্রিন্ট করে findfind .এটি ঠিক আছে বলে মনে হচ্ছে।
Emlai

3
সমস্ত মন্তব্য থেকে "একীভূত" সংস্করণ (উত্তরটি আর সম্পাদনা করা যায় না):for f in `find .`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
রোমারিকড্রিগ্রন

1
কেউ আমাকে ব্যাখ্যা করতে পারেন কেন এটি প্রথম স্থানে কাজ করা উচিত? যদি এটি ./FOO এবং ./FOO/BAR সন্ধান করে তবে এটি প্রথমে নতুন নামকরণ করে / নীচে আমার নিজের উত্তর প্রবেশ করাতে এটি ঠিক করা উচিত।
oisyn

80

আপনার যদি দক্ষতার যত্নের প্রয়োজন না হয় তবে কেবল নিম্নলিখিতটি চেষ্টা করুন।

zip -r foo.zip foo/*
unzip -LL foo.zip

13
বাহ, এটি একটি বেশ অদক্ষ উপায়।
আর্টজম বি

28
অনুমান করে যে গণনার দক্ষতা সাধারণত কোনও উদ্বেগের বিষয় নয় যখন আপনি নিজেকে ডিরেক্টরিতে ফাইলের নাম পরিবর্তন করার প্রয়োজন মনে করেন ... আমি মনে করি এটি সম্ভবত এই থ্রেডের সবচেয়ে সৃজনশীল সমাধান। সত্যিকার অর্থে এমন কিছু যেমন গ্রহণযোগ্য উত্তরগুলি দেখায় তেমন জটিল হওয়া উচিত নয় এবং আমি এই জাতীয় কোনও অপারেশনে যে পরিমাণ চিন্তাভাবনা করতে চাই তার পরিমাণটি এই তুলনায় অনেক বেশি সমানুপাতিক। +1000
পিটার এম এলিয়াস

27
আপনি এটি -0(এটি 'শূন্য', কোনও সংক্ষেপণ নয়) স্যুইচ দিয়ে গতি বাড়িয়ে তুলতে পারেন zip -0 -r foo.zip foo/
জনি বালুনি

3
আমাকে বিভিন্ন ডিরেক্টরি স্ট্রাকচারে 50'000 এর বেশি ফাইলের নাম পরিবর্তন করতে হয়েছিল। মূল গৃহীত উত্তর সবে মাত্র 10% কাজ করেছিল 2 মিনিটে যেখানে -0সংকোচনের সাথে এটি প্রায় তাত্ক্ষণিক!
পিওন

2
এটি কেবল অদক্ষ নয়। অস্থায়ী সংরক্ষণাগারের জন্য পর্যাপ্ত ফাঁকা জায়গা না থাকলে এইটি কেবল অসম্ভব
ভিক্টর ইয়ারেমা

18

ম্যান, আপনি ছেলেরা / গালরা জটিল জিনিসগুলি বেশি পছন্দ করতে চান ... ব্যবহার করুন:

rename 'y/A-Z/a-z/' *

2
এটি কাজ করে না, এটি বলছে যে লোকেস নামের নামের ফাইলটি ইতিমধ্যে বিদ্যমান।
kirhgoff

@ কিরগগোফ আমি দেখেছি যে এনএফএস মাউন্টগুলির সাথে ঘটেছিল - এখানে নির্দেশাবলী অনুসরণ করুন
জোবিসন

কীভাবে আমরা কেস-সংবেদনশীল ফাইল সিস্টেমের নাম পরিবর্তন করতে পারি? rename 'y/a-z/A-Z/' /tmp/*.jpg-> Can't rename /tmp/*.jpg /TMP/*.JPG: No such file or directoryঅর্থাত্, কেবল ফাইলের পরিবর্তে পুরো পথটির নামকরণের চেষ্টা করুন।
পাবলো এ

14

উপরের উত্তরগুলির বেশিরভাগই বিপজ্জনক, কারণ তারা বিজোড় চরিত্রগুলির সাথে নামগুলি নিয়ে কাজ করে না। আর এই ধরনের জন্য সবচেয়ে নিরাপদ বাজি ব্যবহার করা find'র -print0বিকল্প, যা পরিবর্তে হওয়া ASCII NUL সঙ্গে ফাইলের নামের বন্ধ করে দেব \ N।

এখানে একটি স্ক্রিপ্ট রয়েছে, যা কেবল ফাইলগুলিকেই পরিবর্তন করে এবং ডিরেক্টরিটির নামগুলি যাতে বিভ্রান্ত না হয় তা পরিবর্তন করে find:

find .  -type f -print0 | xargs -0n 1 bash -c \
's=$(dirname "$0")/$(basename "$0");
d=$(dirname "$0")/$(basename "$0"|tr "[A-Z]" "[a-z]"); mv -f "$s" "$d"'

আমি এটি পরীক্ষা করেছি এবং এটি ফাঁকা স্থান, সমস্ত ধরণের উদ্ধৃতি ইত্যাদির ফাইলের সাথে কাজ করে এটি গুরুত্বপূর্ণ কারণ কারণ আপনি যদি গাছ হিসাবে চালান তবে একটি গাছের উপর থাকা অন্য স্ক্রিপ্টগুলির মধ্যে একটিতে এটি তৈরি করা ফাইল অন্তর্ভুক্ত রয়েছে

touch \;\ echo\ hacker::0:0:hacker:\$\'\057\'root:\$\'\057\'bin\$\'\057\'bash

... ভাল অনুমান কি ...


renameপরিবর্তে এটি ব্যবহার করা আরও সহজ হবে mv
ভিক্টর ইয়ারেমা

14

আপনার যদি ইতিমধ্যে পুনর্নামকরণ কমান্ডটি স্থাপন বা সেট আপ করে থাকে তবে এটি কাজ করে (উদাহরণস্বরূপ ম্যাকের মধ্যে ব্রিউ ইনস্টলের মাধ্যমে ):

rename --lower-case --force somedir/*

9
... আপনি যদি প্রথমে নতুন নাম সেট আপ করেন, উদাহরণস্বরূপbrew install rename
pduersteler

3
'ওয়াই / এজেড / এজে /' * নাম পরিবর্তন করুন
স্টিফেন

4
--lower-case? কমপক্ষে দুঃখের বিষয়, আর্চ লিনাক্সের ক্ষেত্রে এটি নয়।

3
renameবাশ অন্তর্নির্মিত না। এটি একটি বাহ্যিক ইউটিলিটি এবং আপনার ইনস্টল করা সংস্করণটির উপর নির্ভর করে বাক্য গঠন পৃথক হবে। দাবি হিসাবে এই উত্তরটি "সমস্ত ইউনিক্স ভিত্তিক ওএসের জন্য" পোর্টেবল সমাধান হিসাবে যথেষ্ট নয়।
কোরি গোল্ডবার্গ

2
সন্ধান করা হয়েছে, প্যাকেজের renameমাধ্যমে সর্বশেষ ফেডোরা (২৮) -র অন্তর্ভুক্ত কমান্ডটির বিকল্প নেই। util-linux-2.31--lower-case
niXar

11

এটি সেন্টস / রেড হ্যাট লিনাক্স বা renameপার্ল স্ক্রিপ্ট ব্যতীত অন্য বিতরণগুলিতে কাজ করে :

for i in $( ls | grep [A-Z] ); do mv -i "$i" "`echo $i | tr 'A-Z' 'a-z'`"; done

উত্স: বড় হাতের অক্ষর থেকে ছোট হাতের অক্ষরে সমস্ত ফাইলের নাম পরিবর্তন করুন

(কিছু বিতরণে ডিফল্ট renameকমান্ডটি ইউজ-লিনাক্স থেকে আসে এবং এটি একটি ভিন্ন, বেমানান সরঞ্জাম)


এটি কেবল একটি একক ডিরেক্টরিতে কাজ করে, পুনরাবৃত্তির সাথে নয়
ব্রাম

কুল ... ভাল কাজ করে
মানিকানন্দন রাম

6

ম্যাক ওএস এক্সে আমি যে সহজ পদ্ধিতিটি পেয়েছি তা হ'ল http://plasmasturm.org/code/rename/ থেকে পুনঃনামকরণ প্যাকেজটি ব্যবহার করা :

brew install rename
rename --force --lower-case --nows *

- ফোরামের গন্তব্য নামের একটি ফাইল ইতিমধ্যে উপস্থিত থাকলেও পুনরায় নামকরণ করুন।

- নিম্ন-কেস ফাইলের নামগুলি সমস্ত ছোট ক্ষেত্রে রূপান্তর করুন।

--nows একক আন্ডারস্কোর অক্ষর দিয়ে ফাইলের নামের সাদা জায়গার সমস্ত ক্রম প্রতিস্থাপন করে।


5

বাশ শেল স্ক্রিপ্টটি ব্যবহার করে এখানে আমার সাবoptimal সমাধান:

#!/bin/bash
# First, rename all folders
for f in `find . -depth ! -name CVS -type d`; do
   g=`dirname "$f"`/`basename "$f" | tr '[A-Z]' '[a-z]'`
   if [ "xxx$f" != "xxx$g" ]; then
      echo "Renaming folder $f"
      mv -f "$f" "$g"
   fi
done

# Now, rename all files
for f in `find . ! -type d`; do
   g=`dirname "$f"`/`basename "$f" | tr '[A-Z]' '[a-z]'`
   if [ "xxx$f" != "xxx$g" ]; then
      echo "Renaming file $f"
      mv -f "$f" "$g"
   fi
done

ফোল্ডারগুলির সমস্তটির সঠিক নামকরণ করা হয়, এবং mvঅনুমতিগুলি মেলে না, এবং সিভিএস ফোল্ডারগুলির নতুন নামকরণ করা হয় না (দুর্ভাগ্যক্রমে সেই ফোল্ডারের ভিতরে সিভিএস নিয়ন্ত্রণ ফাইলগুলির নাম পরিবর্তন করা হয়) questions

যেহেতু "ফাইন্ড-ডেপথ" এবং "সন্ধান করুন - সাজান" -র উভয়ই নাম পরিবর্তন করার জন্য ব্যবহারযোগ্য ক্রমে ফোল্ডার তালিকাটি ফিরিয়ে দেয়, তাই আমি ফোল্ডারগুলি অনুসন্ধান করার জন্য "-ডেপথ" ব্যবহার করা পছন্দ করি।


আপনার প্রথম সন্ধানটি কার্যকর হয় না। "Mkdir -p এ / বি / সি" চেষ্টা করুন এবং তারপরে আপনার স্ক্রিপ্টটি চালাবেন।
tzot

4

মূল প্রশ্নটি এসভিএন এবং সিভিএস ডিরেক্টরিগুলি অগ্রাহ্য করার জন্য জিজ্ঞাসা করেছিল, যা ফাইন্ড কমান্ড-প্রুন যোগ করে করা যেতে পারে। যেমন সিভিএস উপেক্ষা:

find . -name CVS -prune -o -exec mv '{}' `echo {} | tr '[A-Z]' '[a-z]'` \; -print

[সম্পাদনা] আমি এটি চেষ্টা করে দেখেছি, এবং অনুসন্ধানের অভ্যন্তরে লোয়ার-কেস অনুবাদ এম্বেড করা আমি আসলে বুঝতে পারি না এমন কারণে কাজ করে না। সুতরাং, এটিকে সংশোধন করুন:

$> cat > tolower
#!/bin/bash
mv $1 `echo $1 | tr '[:upper:]' '[:lower:]'`
^D
$> chmod u+x tolower 
$> find . -name CVS -prune -o -exec tolower '{}'  \;

ইয়ান


4

ল্যারি ওয়াল এর ফাইল নাম ফিক্সার ব্যবহার:

$op = shift or die $help;
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
    $was = $_;
    eval $op;
    die $@ if $@;
    rename($was,$_) unless $was eq $_;
}

এটা যেমন সহজ

find | fix 'tr/A-Z/a-z/'

( fixঅবশ্যই উপরের স্ক্রিপ্টটি কোথায় )


3

এটি একটি ছোট শেল স্ক্রিপ্ট যা আপনি যা অনুরোধ করেছিলেন তা করে:

root_directory="${1?-please specify parent directory}"
do_it () {
    awk '{ lc= tolower($0); if (lc != $0) print "mv \""  $0 "\" \"" lc "\"" }' | sh
}
# first the folders
find "$root_directory" -depth -type d | do_it
find "$root_directory" ! -type d | do_it

প্রথম অনুসন্ধানে -বিশেষ কর্মটি নোট করুন।


1
পুরো থ্রেড থেকে ম্যাকের জন্য কাজ করা একমাত্র কাজ। ধন্যবাদ গাদা!
ইয়ামসালাত

2

কেবল পোর্টেবল নয়, কেবল জেডশ, তবে বেশ সংক্ষিপ্ত।

প্রথমে নিশ্চিত হয়ে নিন zmvযে লোড হয়েছে।

autoload -U zmv

এছাড়াও, নিশ্চিত extendedglobকরুন:

setopt extendedglob

তারপরে ব্যবহার করুন:

zmv '(**/)(*)~CVS~**/CVS' '${1}${(L)2}'

যাও recursively ছোট হাতের অক্ষরে ফাইল ও ডিরেক্টরিগুলি যেখানে নাম নয় জীবনবৃত্তান্ত


2
for f in `find -depth`; do mv ${f} ${f,,} ; done

find -depthডিরেক্টরি ফাইলের আগে মুদ্রিত একটি ডিরেক্টরি বিষয়বস্তু সহ প্রতিটি ফাইল এবং ডিরেক্টরি মুদ্রণ করে। ${f,,}ফাইলের নাম ছোট করে ases


এটি কাজ করে না: বিষয়বস্তুগুলিতে কাজ করার আগে এটি ডিরেক্টরিটির নামকরণ করে, যেমন বিষয়বস্তুগুলির পরবর্তী প্রচেষ্টা ব্যর্থ হয়।
খেজুর

-depthসংশোধন করা হচ্ছে যে! এটি একটি সত্যই দ্রুত সমাধান, তবে অবশ্যই -print0এটির বিকল্পটি ব্যবহার না করে এটি সর্বাধিক নির্ভরযোগ্য নয়
jpaugh

@jpaugh না এটি হয় না। এটি ./FOO/BAR থেকে ./foo/bar নামকরণ করার চেষ্টা করবে, কিন্তু ./foo এখনও উপস্থিত নেই।
oisyn

2

MacOS সহ,

renameপ্যাকেজ ইনস্টল করুন ,

brew install rename

ব্যবহার,

find . -iname "*.py" -type f | xargs -I% rename -c -f  "%"                       

এই কমান্ডটি একটি *.pyএক্সটেনশান সহ সমস্ত ফাইল সন্ধান করে এবং ফাইলের নামগুলি নিম্ন কেসে রূপান্তর করে।

`f` - forces a rename

উদাহরণ স্বরূপ,

$ find . -iname "*.py" -type f
./sample/Sample_File.py
./sample_file.py
$ find . -iname "*.py" -type f | xargs -I% rename -c -f  "%"
$ find . -iname "*.py" -type f
./sample/sample_file.py
./sample_file.py

আপনি কেন এখানে -Iবিকল্প ব্যবহার xargsকরেছেন?
ভিক্টর ইয়ারেমা

- Iপতাকা বাধ্যতামূলক নয়। এটি ব্যবহার করা হয় যখন আমরা একাধিক কমান্ড প্রয়োগ করি xargs। এখানে একাধিক কমান্ড ব্যবহার একটি উদাহরণ xargs cat foo.txt | xargs -I % sh -c 'echo %; mkdir %' তোমাকে ছাড়া চালাতে পারেন -Iমতfind . -iname "*.py" -type f | xargs -I% rename -c -f "%"
akilesh রাজ

2

টাইপসেট ব্যবহার করুন :

typeset -l new        # Always lowercase
find $topPoint |      # Not using xargs to make this more readable
  while read old
  do new="$old"       # $new is a lowercase version of $old
     mv "$old" "$new" # Quotes for those annoying embedded spaces
  done

উইন্ডোজে, গিট ব্যাশের মতো অনুকরণগুলি ব্যর্থ হতে পারে কারণ উইন্ডোজ হুডের নীচে সংবেদনশীল নয়। তাদের জন্য, mvপ্রথমে "$ old.tmp" এর মতো ফাইলটিকে অন্য নামে ফাইলের একটি পদক্ষেপ যুক্ত করুন এবং তারপরে $new


1

দৈর্ঘ্য তবে "কোনও আশ্চর্য ও কোনও ইনস্টলেশন না করেই কাজ করে"

এই স্ক্রিপ্টটি ফাঁক, কোট, অন্যান্য অস্বাভাবিক অক্ষর এবং ইউনিকোড সহ ফাইলের নামগুলি পরিচালনা করে, সংবেদনশীল ফাইল সিস্টেম এবং বেশিরভাগ ইউনিক্স-ওয়াইয়ের পরিবেশে বাশ এবং অ্যাড্ক ইনস্টল করা (যেমন প্রায় সমস্ত) কাজ করে। এটি সংঘর্ষেরও খবর দেয় যদি কোনও (ফাইলের নাম বড় হাতের মধ্যে রেখে) এবং অবশ্যই উভয় ফাইল এবং ডিরেক্টরিগুলির নাম পরিবর্তন করে এবং পুনরাবৃত্তভাবে কাজ করে। অবশেষে এটি অত্যন্ত অভিযোজ্য: আপনি যে ফাইলগুলি / ডায়ারগুলি চান তা লক্ষ্য করে ফাইন্ড কমান্ডটি টুইঙ্ক করতে পারেন এবং অন্য নামের ম্যানিপুলেশনগুলি করতে আপনি জাগ্রত করতে পারেন। মনে রাখবেন যে "ইউনিকোড হ্যান্ডেলগুলি" দ্বারা আমার অর্থ হ'ল এটি সত্যই তাদের কেসকে রূপান্তরিত করবে (তাদের ব্যবহারের উত্তরগুলির মতো এড়ানো হবে না tr)।

# adapt the following command _IF_ you want to deal with specific files/dirs
find . -depth -mindepth 1 -exec bash -c '
  for file do
    # adapt the awk command if you wish to rename to something other than lowercase
    newname=$(dirname "$file")/$(basename "$file" | awk "{print tolower(\$0)}")
    if [ "$file" != "$newname" ] ; then
        # the extra step with the temp filename is for case-insensitive filesystems
        if [ ! -e "$newname" ] && [ ! -e "$newname.lcrnm.tmp" ] ; then
           mv -T "$file" "$newname.lcrnm.tmp" && mv -T "$newname.lcrnm.tmp" "$newname" 
        else
           echo "ERROR: Name already exists: $newname"
        fi
    fi    
  done
' sh {} +

তথ্যসূত্র

আমার স্ক্রিপ্ট এই দুর্দান্ত উত্তরের উপর ভিত্তি করে:

/unix/9496/looping-through-files-with-spaces-in-the-names

বাশে কিভাবে একটি স্ট্রিং লোয়ার কেসে রূপান্তর করবেন?


1

এটি ম্যাকোএসেও দুর্দান্তভাবে কাজ করে:

ruby -e "Dir['*'].each { |p| File.rename(p, p.downcase) }"

এটি বিশেষত দুর্দান্ত কারণ ম্যাকস সহ রুবি জাহাজগুলি।
jxmorris12

1

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

ls | while read upName; do loName=`echo "${upName}" | tr '[:upper:]' '[:lower:]'`; mv "$upName" "$loName"; done

(এনবি: আমি পূর্বে আন্ডারস্কোর ব্যবহার করে শ্বেত স্পেস প্রতিস্থাপন করেছি:

for f in *\ *; do mv "$f" "${f// /_}"; done

)


1

ওএস এক্স-এ, mv -f"একই ফাইল" ত্রুটি দেখায়, তাই আমি দুবার নাম পরিবর্তন করেছি:

for i in `find . -name "*" -type f |grep -e "[A-Z]"`; do j=`echo $i | tr '[A-Z]' '[a-z]' | sed s/\-1$//`; mv $i $i-1; mv $i-1 $j; done

1

আমি এই পরিস্থিতিতে পাইথনের পৌঁছে যাব, ফাঁকা জায়গা বা স্ল্যাশ ছাড়াই আশাবাদী পথ অনুমান করা এড়াতে। আমি এটিও খুঁজে পেয়েছি যে এর python2চেয়ে আরও বেশি জায়গায় ইনস্টল করা থাকে rename

#!/usr/bin/env python2
import sys, os

def rename_dir(directory):
  print('DEBUG: rename('+directory+')')

  # Rename current directory if needed
  os.rename(directory, directory.lower())
  directory = directory.lower()

  # Rename children
  for fn in os.listdir(directory):
    path = os.path.join(directory, fn)
    os.rename(path, path.lower())
    path = path.lower()

    # Rename children within, if this child is a directory
    if os.path.isdir(path):
        rename_dir(path)

# Run program, using the first argument passed to this Python script as the name of the folder
rename_dir(sys.argv[1])

এটিকে জটিল করে তোলার বিষয়ে কথা বলুন ... শুধু করুন .. 'y / AZ / az /' * এর নাম পরিবর্তন করুন
স্টিফেন

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

1

আপনি ব্যবহার করেন তাহলে আর্চ লিনাক্স , আপনি ইনস্টল করতে পারেন rename) প্যাকেজ থেকে AURযে উপলব্ধ renamexmহিসাবে কমান্ড /usr/bin/renamexmএক্সিকিউটেবল এবং একটি ম্যানুয়াল পৃষ্ঠা এটি সঙ্গে বরাবর।

ফাইল এবং ডিরেক্টরিগুলির দ্রুত নামকরণের জন্য এটি একটি সত্যই শক্তিশালী সরঞ্জাম।

লোয়ারকেসে রূপান্তর করুন

rename -l Developers.mp3 # or --lowcase

UPPER কেসে রূপান্তর করুন

rename -u developers.mp3 # or --upcase, long option

অন্যান্য অপশন

-R --recursive # directory and its children

-t --test # Dry run, output but don't rename

-o --owner # Change file owner as well to user specified

-v --verbose # Output what file is renamed and its new name

-s/str/str2 # Substitute string on pattern

--yes # Confirm all actions

আপনি যদি প্রয়োজন হয় তবে এখান থেকে বিকাশকারী.এমপি 3 ফাইলটি নমুনা আনতে পারেন;)


1
brewম্যাকোস থেকে নাম পরিবর্তন করে -lএকটি সিমিলিংক তৈরি -cকরতে এবং ছোট হাতের কাছে রূপান্তর করতে বাধ্য, তাই দেখুন।
rien333

0
( find YOURDIR -type d | sort -r;
  find yourdir -type f ) |
grep -v /CVS | grep -v /SVN |
while read f; do mv -v $f `echo $f | tr '[A-Z]' '[a-z]'`; done

প্রথমে ডিরেক্টরিগুলি নীচের অংশে সাজান -r (যেখানে -বিধি উপলব্ধ নেই), তারপরে ফাইলগুলি নামকরণ করুন । তারপরে গ্রেপ-ভি / সিভিএসের পরিবর্তে অনুসন্ধান করুন ...- ছাঁটাই করা সহজ কারণ এটি সহজ। বড় ডিরেক্টরিগুলির জন্য, এফ ... এর জন্য কিছু শেল বাফার উপচে পড়তে পারে। সন্ধান করুন ... | যে এড়ানোর জন্য পড়তে হবে।

এবং হ্যাঁ, এটি ক্লোবার ফাইলগুলিকে কেবল পৃথক ক্ষেত্রে পৃথক করবে ...


প্রথম: find YOURDIR -type d | sort -rখুব ঝামেলা। আপনি চান find YOURDIR -depth -type d। দ্বিতীয়ত, find -type fডিরেক্টরিগুলির পুনরায় নামকরণের পরে চলমান আবশ্যক।
tzot

0
find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh

আমি এখানে উল্লিখিত আরও বিস্তৃত স্ক্রিপ্টগুলি চেষ্টা করিনি, তবে একক কমান্ডলাইন সংস্করণ আমার সিএনোলজি এনএএস-এ আমার জন্য কাজ করে নি। renameউপলভ্য নয় এবং findব্যর্থতার অনেকগুলি প্রকারভেদ কারণ এটি ইতিমধ্যে পুনরায় নামকরণ করা পথের পুরানো নামটির সাথে লেগে গেছে বলে মনে হয় (যেমন, যদি এটি ./FOOঅনুসরণ করে তবে ./FOO/BARপুনরায় নামকরণ ./FOOকরা ./fooএখনও তালিকা অবিরত থাকবে ./FOO/BARযদিও সেই পথটি আর বৈধ নয়) । উপরের কমান্ডটি কোনও সমস্যা ছাড়াই আমার পক্ষে কাজ করেছে।

নিম্নলিখিতটি হ'ল কমান্ডের প্রতিটি অংশের ব্যাখ্যা:


find . -depth -name '*[A-Z]*'

এটি .ডিপথ-ফার্স্ট অনুসন্ধান (উদাহরণস্বরূপ, এটি ./foo/barআগে তালিকাভুক্ত করবে) ব্যবহার করে বর্তমান ডিরেক্টরি থেকে যে কোনও ডিরেক্টরি ( আপনি যে ডিরেক্টরিতে প্রক্রিয়া করতে চান তা পরিবর্তন করুন) থেকে কোনও ফাইল খুঁজে পাবেন ./fooতবে কেবল সেই ফাইলগুলির জন্য যা বড় হাতের অক্ষর ধারণ করে। -nameফিল্টারটি কেবলমাত্র পুরো ফাইলের নাম নয়, কেবল ফাইল ফাইলের নামের সাথে প্রযোজ্য। সুতরাং এই তালিকা ./FOO/BARকিন্তু না ./FOO/bar। এটি ঠিক আছে, কারণ আমরা নাম পরিবর্তন করতে চাই না ./FOO/bar। আমরা ./FOOযদিও নাম পরিবর্তন করতে চাই তবে এটির পরে তালিকাবদ্ধ করা হয়েছে (এ কারণেই -depthএটি গুরুত্বপূর্ণ)।

এই কোমন্ড নিজেই সেই ফাইলগুলি সন্ধান করতে বিশেষভাবে কার্যকর যা আপনি প্রথমে নাম পরিবর্তন করতে চান to ফাইলের নাম সংঘর্ষ বা ত্রুটির কারণে এখনও প্রতিস্থাপন করা হয়নি এমন ফাইলগুলির সন্ধান করতে সম্পূর্ণ নামকরণ কমান্ডের পরে এটি ব্যবহার করুন।


sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'

এই অংশটি আউটপুট করা ফাইলগুলি পড়ে findএবং mvনিয়মিত এক্সপ্রেশন ব্যবহার করে একটি কমান্ডে তাদের ফর্ম্যাট করে । -nবিকল্প স্টপ sedইনপুট মুদ্রণ থেকে, এবং pঅনুসন্ধান-এবং-প্রতিস্থাপন Regex আউটপুট প্রতিস্থাপিত টেক্সট কমান্ড।

রেজেক্স নিজেই দুটি ক্যাপচার নিয়ে গঠিত: শেষ / শেষ পর্যন্ত অংশ (যা ফাইলের ডিরেক্টরি) এবং ফাইলের নাম নিজেই। ডিরেক্টরিটি অক্ষত রয়েছে, তবে ফাইলের নামটি ছোট হাতের অক্ষরে রূপান্তরিত হয়। সুতরাং, যদি findআউটপুট ./FOO/BAR, এটি হয়ে যাবে mv -n -v -T ./FOO/BAR ./FOO/bar-nবিকল্প mvনিশ্চিত ছোট হাতের ফাইল বিদ্যমান তোলে ওভাররাইট নেই। -vবিকল্প তোলে mvপ্রতিটি পরিবর্তন এটি তোলে (- যদি বা দেখা যায় না আউটপুট ./FOO/barআগে থেকেই আছে, এটা ভালো কিছু আউটপুট ./FOO/BAR -> ./FOO/BAR, তিনি উল্লেখ করেছেন পরিবর্তন করা হয়েছে)। -Tএখানে খুবই গুরুত্বপূর্ণ - এটা ডাইরেক্টরি হিসাবে লক্ষ্য ফাইল একইরূপে। এটি নিশ্চিত করে তুলবে যে ডিরেক্টরিটি বিদ্যমান থাকলে সেটি ./FOO/BARসরানো হয়নি ./FOO/bar

findকার্যকর করা হবে এমন কমান্ডগুলির একটি তালিকা তৈরি করতে এটির সাথে একসাথে ব্যবহার করুন (আসলে তা না করে যা করা হবে তা যাচাই করতে সহজ)


sh

এটি বেশ স্ব-ব্যাখ্যামূলক। এটি সমস্ত উত্পন্ন mvকমান্ড শেল ইন্টারপ্রেটারে নিয়ে যায়। আপনি এটিকে bashবা আপনার পছন্দসই শেলটি প্রতিস্থাপন করতে পারেন ।


0

স্লগিফাই পুনর্নামকরণ (পুনরায়)

ওপি ঠিক যা চেয়েছিল তা নয়, তবে এই পৃষ্ঠায় আমি কী খুঁজে পেতে আশা করছিলাম:

ফাইলগুলির নাম পরিবর্তন করার জন্য একটি "স্লগাইফাই" সংস্করণ যাতে সেগুলি ইউআরএলগুলির অনুরূপ (যেমন কেবলমাত্র বর্ণানুক্রমিক, বিন্দু এবং ড্যাশ অন্তর্ভুক্ত থাকে):

rename "s/[^a-zA-Z0-9\.]+/-/g" filename

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