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




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

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

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

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

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

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

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

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

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

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


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

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

आदमी आप लोगों को जटिल चीजों से अधिक पसंद है ..

नाम बदलें 'वाई / एजेड / एजी /' *


ऊपर दिए गए अधिकांश उत्तर खतरनाक हैं क्योंकि वे अजीब पात्रों वाले नामों से निपटते नहीं हैं। इस तरह की चीज़ के लिए आपकी सबसे सुरक्षित शर्त खोज -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

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


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

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", फिर $ नया।


पहले पोस्ट बॉक्स के बाहर या साधारण मामलों के लिए कुछ समायोजन के साथ पूरी तरह से काम करेगा, लेकिन कुछ स्थितियां हैं जिन्हें आप बैच नाम बदलने से पहले ध्यान में रखना चाहते हैं:

  1. क्या होना चाहिए यदि आपके पास पथ पदानुक्रम में एक ही स्तर पर दो या दो से अधिक नाम हैं जो केवल ABCdef , abcDEF और aBcDeF जैसे मामले से अलग हैं? क्या नाम बदलें स्क्रिप्ट निरस्त या सिर्फ चेतावनी और जारी रखना चाहिए?

  2. गैर यूएस-एएससीआईआई नामों के लिए आप कम मामले को कैसे परिभाषित करते हैं? यदि ऐसे नाम मौजूद हो सकते हैं, तो क्या किसी को पास की जांच करनी चाहिए और बहिष्कृत करना चाहिए?

  3. यदि आप सीवीएस या एसवीएन कामकाजी प्रतियों पर नाम बदलें ऑपरेशन चला रहे हैं, तो आप फ़ाइल या निर्देशिका नामों पर केस बदलते समय कार्यशील प्रतिलिपि को दूषित कर सकते हैं। क्या स्क्रिप्ट को आंतरिक प्रशासनिक फ़ाइलों जैसे .svn / प्रविष्टियों या सीवीएस / प्रविष्टियों को भी ढूंढ और समायोजित करना चाहिए?


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

#!/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" का उपयोग करना पसंद किया।


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

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

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

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

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

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

यदि आप आर्क लिनक्स का उपयोग करते हैं, तो आप 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 --lower-case --force somedir/*

यह पर्ल स्क्रिप्ट 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 कमांड उपयोग-लिनक्स से आता है, और यह एक अलग, असंगत उपकरण है)


स्पेस या स्लेश के बिना आशावादी रूप से पथों को समझने से बचने के लिए, मैं इस स्थिति में अजगर के लिए पहुंचूंगा। मैंने यह भी पाया है कि rename से अधिक स्थानों में python2 स्थापित किया जाता है।

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

"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" ) के साथ अधिक लचीलापन की अनुमति देता है।


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

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


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






directory-traversal