linux बदलत लिनक्स पर लोअरकेस के लिए सभी फ़ोल्डरों और फ़ाइलों का नाम कैसे बदलें?




फेसबुक में नाम कैसे बदलें (19)

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

find -depth प्रत्येक फ़ाइल और निर्देशिका को मुद्रित करता है, निर्देशिका की सामग्री से पहले मुद्रित निर्देशिका की सामग्री के साथ। ${f,,} फ़ाइल नाम को कम करता है।

मुझे एक पूर्ण फ़ोल्डर पेड़ को दोबारा नाम बदलना है ताकि कोई अपरकेस अक्षर कहीं भी दिखाई न दे (यह सी ++ स्रोत कोड है, लेकिन इससे कोई फर्क नहीं पड़ता)। सीवीएस और एसवीएन नियंत्रण फाइलों / फ़ोल्डरों को अनदेखा करने के लिए बोनस अंक। पसंदीदा तरीका एक शेल स्क्रिप्ट होगा, क्योंकि किसी भी लिनक्स बॉक्स में खोल उपलब्ध होना चाहिए।

फ़ाइल नामकरण के ब्योरे के बारे में कुछ वैध तर्क थे।

  1. मुझे लगता है कि समान लोअरकेस नाम वाली फाइलों को ओवरराइट किया जाना चाहिए, यह उपयोगकर्ता की समस्या है। किसी केस-अनदेखी फ़ाइल सिस्टम पर चेक आउट होने पर बाद वाले के साथ पहले व्यक्ति को ओवरराइट कर दिया जाएगा।

  2. मैं एजेड अक्षरों पर विचार करता हूं और उन्हें एजी में बदल देता हूं, बाकी सब कुछ सिर्फ समस्याओं के लिए बुला रहा है (कम से कम स्रोत कोड के साथ)।

  3. लिनक्स सिस्टम पर निर्माण चलाने के लिए स्क्रिप्ट की आवश्यकता होगी, इसलिए मुझे लगता है कि सीवीएस या एसवीएन नियंत्रण फ़ाइलों में परिवर्तन छोड़े जाना चाहिए। आखिरकार, यह सिर्फ एक स्क्रैच चेकआउट है। शायद एक "निर्यात" अधिक उपयुक्त है।


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

Slugify नाम बदलें (regex)

ओपी ने बिल्कुल क्या नहीं पूछा, लेकिन मैं इस पृष्ठ पर क्या ढूंढ रहा था:

फ़ाइलों का नाम बदलने के लिए एक "slugify" संस्करण ताकि वे यूआरएल के समान हैं
(यानी केवल अल्फान्यूमेरिक, डॉट्स और डैश शामिल हैं):

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

यदि आप आर्क लिनक्स का उपयोग करते हैं, तो आप AUR से rename पैकेज इंस्टॉल कर सकते हैं जो renamexm कमांड को /usr/bin/renamexm निष्पादन योग्य और उसके साथ इसके manual पृष्ठ के रूप में प्रदान करता है।

फ़ाइलों और निर्देशिकाओं का त्वरित नाम बदलने के लिए यह वास्तव में शक्तिशाली उपकरण है।

लोअरकेस में कनवर्ट करें

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 # substite string on pattern

--yes # Confirm all actions

यदि आवश्यक हो तो आप here से डेवलपर डेवलपर.एमपीओ फ़ाइल ला सकते हैं;)


मैकोज़ के साथ,

rename पैकेज स्थापित करें,

brew install rename

उपयोग,

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

यह आदेश *.py एक्सटेंशन वाली सभी फ़ाइलों को *.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

अभी भी मुझे बहुत पसंद है

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

ओएस एक्स के एचएफएस + जैसे असंवेदनशील फाइल सिस्टम के मामले में, आप -एफ ध्वज जोड़ना चाहेंगे

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

"rename" कमांड का उपयोग कर एक संक्षिप्त संस्करण।

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

इससे फ़ाइलों से पहले नामकरण की जा रही निर्देशिकाओं और गैर-मौजूदा निर्देशिकाओं (जैसे "A/A" में "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" ) के साथ अधिक लचीलापन की अनुमति देता है।


( 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

सबसे पहले नीचे निर्देशिकाओं का नाम बदलें- आर (जहां -depth उपलब्ध नहीं है), फिर फ़ाइलें। फिर grep -v / सीवीएस खोजने के बजाय ...- prune क्योंकि यह आसान है। बड़ी निर्देशिकाओं के लिए, एफ में ... कुछ खोल बफर ओवरफ्लो कर सकते हैं। खोजें का उपयोग करें ... | जबकि इससे बचने के लिए पढ़ें

और हाँ, यह फाइलों को बंद कर देगा जो केवल मामले में भिन्न है ...


ऊपर दिए गए अधिकांश उत्तर खतरनाक हैं क्योंकि वे अजीब पात्रों वाले नामों से निपटते नहीं हैं। इस तरह की चीज़ के लिए आपकी सबसे सुरक्षित शर्त खोज -print0 विकल्प का उपयोग करना है, जो \ n के बजाय ascii NUL के साथ फ़ाइल नाम समाप्त कर देगा। यहां मैं इस स्क्रिप्ट को सबमिट करता हूं, जो केवल फाइलों को बदलता है, न कि निर्देशिका नामों को, ताकि खोज को भ्रमित न किया जा सके।

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

... अच्छा अंदाजा लगाए ...


अगर आपको दक्षता की परवाह करने की आवश्यकता नहीं है तो बस बस कोशिश करें।

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

यह पर्ल स्क्रिप्ट rename बिना CentOS / Redhat या अन्य वितरण पर काम करता है:

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

स्रोत: https://linuxconfig.org/rename-all-files-from-uppercase-to-lowercase-characters

(कुछ distros में डिफ़ॉल्ट rename कमांड उपयोग-लिनक्स से आता है, और यह एक अलग, असंगत उपकरण है)


ओएसएक्स में, एमवी-एफ "एक ही फाइल" त्रुटि दिखाता है, इसलिए मैं दो बार नाम बदलता हूं।

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

मूल प्रश्न एसवीएन और सीवीएस निर्देशिकाओं को अनदेखा करने के लिए कहा जाता है, जो खोज कमांड को जोड़ने के द्वारा किया जा सकता है। सीवीएस को अनदेखा करने के लिए:

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 '{}'  \;

इयान


यह काम करता है अगर आपके पास पहले से ही नाम बदलें या नाम बदलें (उदाहरण के लिए मैक में ब्रू इंस्टॉल के माध्यम से):

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

लैरी वॉल के फ़ाइल नाम फिक्सर का उपयोग करना

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

यह उतना आसान है जितना

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

(जहां निश्चित रूप से उपरोक्त स्क्रिप्ट है)


मुझे इसे विंडोज 7 पर एक सिग्विन सेटअप पर करने की ज़रूरत थी और पाया कि मुझे ऊपर से दिए गए सुझावों के साथ सिंटैक्स त्रुटियां मिलीं, हालांकि मैंने कोशिश की थी (हालांकि मुझे एक काम करने का विकल्प याद आ सकता है) हालांकि यह समाधान सीधे यूबुतू मंचों से बाहर किया गया है :-)

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

(एनबी मैंने पहले व्हाइटस्पेस को अंडरस्कोर का उपयोग करके बदल दिया था

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

कोई भी टाइपसेट का सुझाव नहीं दे रहा है?

typeset -l new        # always lowercase
find $topPoint |      # not using xargs to make this more readable
  while read old
  do mv "$old" "$new" # quotes for those annoying embedded spaces
  done

गिट बैश जैसे विंडोज़ इम्यूलेशन पर यह असफल हो सकता है क्योंकि विंडोज़ हुड के नीचे केस संवेदनशील नहीं है। उन लोगों के लिए, एक कदम जोड़ें जो एमवी की फाइल पहले किसी अन्य नाम पर है, जैसे "$ old.tmp", फिर $ नया।


यह एक छोटी शेल स्क्रिप्ट है जो आपने अनुरोध किया है:

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

पहले खोज में द्विध्रुवीय कार्रवाई पर ध्यान दें।


बैश शैल स्क्रिप्ट का उपयोग करके, मेरा उप-समाधान समाधान यहां दिया गया है:

#!/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

संपादित करें: मैंने अभी तक सुझावों के आधार पर कुछ संशोधन किए हैं। अब फ़ोल्डरों का सही नाम बदल दिया गया है, एमवी अनुमति नहीं दे रहे हैं जब अनुमतियां मेल नहीं खाती हैं, और सीवीएस फ़ोल्डरों का नाम नहीं बदला जाता है (दुर्भाग्य से उस फ़ोल्डर के अंदर सीवीएस नियंत्रण फाइलों का नाम बदल दिया जाता है)।

संपादित करें: चूंकि "find -depth" और "find | sort -r" दोनों नामकरण के लिए उपयोग करने योग्य क्रम में फ़ोल्डर सूची लौटाते हैं, इसलिए मैंने फ़ोल्डर खोजने के लिए "-depth" का उपयोग करना पसंद किया।







directory-traversal