উত্তর:
সমস্ত ডিরেক্টরি এক স্তরে, বা পুনরাবৃত্তির সাথে?
এক স্তর করুন:
autoload zmv
zmv -o-i -Q 'root/(*)(/)' 'root/${1:l}'
recursively:
zmv -o-i -Q 'root/(**/)(*)(/)' 'root/$1${2:l}'
ব্যাখ্যা: zmv
প্রদত্ত প্রতিস্থাপন টেক্সট অনুযায়ী নকশার সাথে মেলে এমন ফাইল renames। -o-i
পাসের -i
প্রতিটি বিকল্প mv
ফণা অধীন কমান্ড (নীচে দেখুন)। প্রতিস্থাপন লেখা, $1
, $2
, ইত্যাদি প্যাটার্ন ধারাবাহিক আলাদা গ্রুপ আছে। **
যাও recursively সমস্ত (সাব) * ডিরেক্টরি মানে। চূড়ান্ত (/)
একটি আলাদা গ্রুপ নয় বরং একটি উল্লিখিত glob কোয়ালিফায়ার শুধুমাত্র ডিরেক্টরি মেলে অর্থ। ${2:l}
ধর্মান্তরিত $2
ছোট হাতের অক্ষরে।
এক স্তর করুন:
for x in root/*/; do mv -i "$x" "$(printf %s "$x" | tr '[:upper:]' '[:lower:]')"; done
চূড়ান্ত /
পরিমিত ডিরেক্টরি থেকে ম্যাচিং, এবং mv -i
তোলে একটি সংঘর্ষের ক্ষেত্রে নিশ্চিতকরণ জন্য জিজ্ঞাসা করুন। সরান -i
একটি সংঘর্ষের, এবং ব্যবহার ক্ষেত্রে ওপর দিয়েই লিখতে yes n | for …
। না ব্যাক অনুরোধ করা কোনো পুনঃনামকরনের যে ধাক্কা লাগা হবে সঞ্চালন।
recursively:
find root/* -depth -type d -exec sh -c '
t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
[ "$t" = "$0" ] || mv -i "$0" "$t"
' {} \;
ব্যবহারের -depth
নিশ্চিত করে যে গভীরভাবে নেস্টেড ডিরেক্টরি তাদের পূর্বপুরুষদের সামনে প্রক্রিয়া করা হয়। নাম প্রক্রিয়াকরণ একটা হচ্ছে উপর নির্ভর /
; যদি আপনি বর্তমান ডিরেক্টরির মধ্যে অপারেট কল করতে চান, ব্যবহার ./*
(অভিযোজিত শেল স্ক্রিপ্ট সঙ্গে মানিয়ে নিতে .
বা *
পাঠকদের জন্য একটি ব্যায়াম যেমন ছেড়ে দেওয়া হয়)।
এখানে আমি পার্ল পুনঃনামকরণ স্ক্রিপ্ট ব্যবহার করে উবুন্টু এবং ডেবিয়ান জাহাজ /usr/bin/prename
(সাধারণত হিসাবে উপলব্ধ rename
পাশাপাশি)। এক স্তর করুন:
rename 's!/([^/]*/?)$!\L/$1!' root/*/
Recursively, ব্যাশ ≥4 বা zsh সঙ্গে
shopt -s globstar # only in bash
rename 's!/([^/]*/?)$!\L/$1!' root/**/*/
Recursively, portably:
find root -depth -type d -exec rename -n 's!/([^/]*/?)$!\L/$1!' {} +
-execdir
যা দুর্দান্ত: unix.stackexchange.com/questions/5412/... আমি তখন পাওয়া এটি কিছু আছে যা PATH
পাগলামি এবং দু: খিত :-( ছিল
সেখানে একটি কমান্ডের যে কি করবে না, কিন্তু আপনি ভালো কিছু করতে পারেন:
for fd in */; do
#get lower case version
fd_lower=$(printf %s "$fd" | tr A-Z a-z)
#if it wasn't already lowercase, move it.
[ "$fd" != "$fd_lower" ] && mv "$fd" "$fd_lower"
done
আপনি এটা শক্তসমর্থ হতে হবে, তাহলে আপনি ইতিমধ্যেই দুই ডিরেক্টরি যেটি শুধুমাত্র ক্ষেত্রে ভিন্ন জন্য অ্যাকাউন্ট করা উচিত নয়।
একটি এক মাছ ধরার নৌকা হিসাবে:
for fd in */; do fd_lower=$(printf %s "$fd" | tr A-Z a-z) && [ "$fd" != "$fd_lower" ] && mv "$fd" "$fd_lower"; done
for file in * ; do if [ -d "$file" ] ; then dest="$(echo $file | sed y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/)" ; [ "$dest" != "$file" ] && mv "$file" "$dest" ; fi ; done
find -type d
, কিন্তু বেশ বুঝে উঠতে পারতাম না
for fd in */;
এইভাবে চেক জন্য প্রয়োজন এড়ানো যদি এটি একটি ডিরেক্টরির ছিলেন, কিন্তু আমি কোন ধারণা আছে এই প্রবৃত্তি একটি ভাল ছিল।
tr
ইতিমধ্যে একটি সীমার আশা তাই tr '[A-Z]' '[a-z]'
অনুবাদ করে [
করতে [
এবং ]
করতে ]
পার না। এটি অকেজো তবে ক্ষতিহীন; তবে উদ্ধৃতি চিহ্ন বিনা শেল বন্ধনী প্রসারিত হবে যদি বর্তমান ডিরেক্টরির মধ্যে একটি এক বড় হাতের অক্ষর নামের একটি ফাইল ছিল।
আমি এক-লাইনের চ্যালেঞ্জ :) প্রথমত, একটি পরীক্ষা ক্ষেত্রে প্রতিষ্ঠা হিসেবে এই নেন:
$ for d in foo Bar eVe; do mkdir -p dcthis/$d; touch dcthis/a${d}.txt; done
$ ls dcthis/
Bar aBar.txt aeVe.txt afoo.txt eVe foo
আমি ব্যবহার find
বড়হাতের অক্ষর সঙ্গে ডিরেক্টরি স্পট এবং তারপর এর মাধ্যমে তাদের downcase । অনুমান করার চেষ্টাটি কিছুটা হ্যাক-ইশ, তবে আমি যখন সরাসরি জিনিসগুলি পালানোর চেষ্টা করি তখন আমার মাথা সর্বদা বিস্ফোরিত হয়।sh -c 'mv {}
echo {} | tr [:upper:] [:lower:]
'sh -c
find
$ (cd dcthis && find . -maxdepth 1 -type d -path '*[A-Z]*' -exec sh -c 'mv {} `echo {} | tr [:upper:] [:lower:]`' \;)
$ ls dcthis/
aBar.txt aeVe.txt afoo.txt bar eve foo
সতর্ক থাকুন: এই সমাধান দুর্ঘটনায় বিশালাকার downcasing কিনা পরীক্ষা করে না!
mv -i
। একটি বড় সমস্যা যে আপনি মূল্য উদ্ধৃতি সঠিক ব্যবহার করেন নি তাই যদি সেখানে বিশেষ অক্ষর (হোয়াইটস্পেস বা হয় আপনার কমান্ড ব্যর্থ হবে \[*?
) নামে যে কোন জায়গায়। ব্যবহারের কোন বিন্দু আছে find
, যদি না recursing, এবং তারপর আপনার যা দরকার find -depth
, এবং -path
হতে হবে -name
। কাজ উদাহরণের জন্য আমার উত্তর দেখুন।
mv -i
এই লেখার পর। উদ্ধৃতি দিয়ে ভাল পয়েন্ট ...
find -execdir
| পুনঃনামকরণ
এই এটা করতে হলে আপেক্ষিক পাথ উন্মাদ না থাকত সবচেয়ে ভালো উপায় হবে যেমন শুধুমাত্র basename কাজ করার জন্য পার্ল Regex ফু এড়াতে:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find a -depth -execdir rename 's/(.*)/\L$1/' '{}' \;
-execdir
প্রথম cd
শুধুমাত্র basename উপর চালানোর আগে ডিরেক্টরির মধ্যে s।
দুর্ভাগ্যবশত, আমি যে পরিত্রাণ পেতে পারেন না PATH
ফাটান অংশ, find -execdir
আপনি একটি আপেক্ষিক পথ থাকতে কিছু করতে রাজি PATH
...: /ubuntu/621132/why-using-the-execdir-action- is-অনিরাপদ-জন্য-ডিরেক্টরি যা-is-ইন-দ্য-পাথ / 1109378 # 1109378
mv -i a a
দিন "এমভি: অবৈধ যুক্তি: একটি / একটি করার জন্য একটি নামান্তর"।