वर्तमान निर्देशिका के सभी फ़ाइल नाम में एक चार्ट को दूसरे के साथ कैसे बदलें?


41

आप वर्तमान फ़ोल्डर में सभी फ़ाइलों / सबडिर का नाम कैसे बदल सकते हैं?

कहते हैं, मेरे पास बहुत सी फाइलें और उप-श्रेणियां हैं जो रिक्त स्थान के साथ हैं और मैं सभी स्थानों को एक अंडरस्कोर के साथ बदलना चाहता हूं।

File 1
File 2
File 3
Dir 1
Dir 3

का नाम बदला जाना चाहिए

File_1
File_2
File_3
Dir_1
Dir_3

जवाबों:


36

यदि आपको उपनिर्देशिकाओं में भी फ़ाइलों का नाम बदलने की आवश्यकता है, और आपका विधेय findका समर्थन करता -execdirहै, तो आप कर सकते हैं

find /search/path -depth -name '* *' \
    -execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;

@ मुझे सुझाव -depthदेने findऔर मुझे सोचने के लिए विकल्प के लिए @ ग्लेन जैकमैन को धन्यवाद ।

ध्यान दें कि कुछ सिस्टम (GNU / Linux वाले सहित), findउन फ़ाइलों को खोजने में विफल हो सकते हैं जिनके नाम में रिक्त स्थान होते हैं और बाइट्स के अनुक्रम भी होते हैं जो वैध वर्ण नहीं बनाते हैं (गैर-ASCII वर्णों वाले मीडिया फ़ाइलों के साथ विशिष्ट वर्णमाला में एन्कोड किए गए लोकेल से अलग है)। C(के रूप में LC_ALL=C find...) स्थान निर्धारित करने से समस्या का समाधान होगा।


आपको find -maxdepth 1ओपी को वर्तमान फ़ोल्डर पर काम करने के बारे में वास्तव में क्या करने के लिए उपयोग करने की आवश्यकता होगी ।
कालेब

1
खोज के -depthविकल्प का उपयोग करें , और आप से छुटकारा पा सकते हैं sort
ग्लेन जैकमैन

@ ग्लेन जैकमैन: धन्यवाद, मैं अब समझता हूं कि मेरा समाधान गलत था।
enzotib

2
बदलें -name '* *'करने के लिए -name '*_*'और परिवर्तन "${1// /_}"करने के लिए"${1//_/.}"
enzotib

1
@क्रोइज़: इसे "पैटर्न प्रतिस्थापन" कहा जाता है। आप इसे bashमैन पेज में पा सकते हैं ।
एनज़ोटिब

34

किसी भी शेल में, आप उन फाइलों पर लूप कर सकते हैं, जिनके नाम में एक स्पेस है। अंडरस्कोर के साथ रिक्त स्थान को बदलना ${VARIABLE//PATTERN/REPLACEMENT}निर्माण के साथ बैश, ksh और zsh में आसान है ।

for x in *" "*; do
  mv -- "$x" "${x// /_}"
done

डेबियन, उबंटू और डेरिवेटिव पर, आप पर्ल का उपयोग कर सकते हैं rename(अन्य वितरण के रूप में एक अलग कार्यक्रम जहाज करते हैं rename, और यह कार्यक्रम यहां सहायक नहीं है)।

rename 's/ /_/g' *

एक अनिवार्य योग समाधान:

autoload zmv
zmv '(*)' '${1// /_}'

एक अनिवार्य POSIX समाधान:

for x in *" "*; do
  y=$(printf %sa "$x" | tr " " "_")
  mv -- "$x" "${y%a}"
done

"नाम" कमांड के अंत में 'g' का क्या अर्थ है? मैंने इसे मैनुअल में नहीं देखा था।
जूलियनलाई

केवल निर्देशिका का नाम कैसे बदलें? मैं फ़ाइल नाम बदलना नहीं चाहता।
जूलियनलाई

@ जूलियनलाई का s/…/…/gअर्थ है सभी घटनाओं को बदलना। यह बहुत अच्छी तरह से मैनुअल में नहीं समझाया गया है । यदि आप निर्देशिकाओं का नाम बदलना चाहते हैं, तो तरीके हैं, कृपया इसके लिए खोज करें (मुझे लगता है कि मैंने इसे पहले देखा है) और यदि आप नहीं पाते हैं तो यह एक नया प्रश्न पूछ सकता है।
गिल्स एसओ- बुराई को रोकना

महान ... इससे मुझे सभी _MG_blah.JPGका नाम बदलने में मदद मिली IMG_blah.JPG
अविनाश दाश

13

आप इसके लिए उपयोग कर सकते हैं rename(यहाँ से एक को util-linuxनहीं, एक को मानते हुए perl):

cd /path/to/dir
rename ' ' _ *\ *

यह सभी फाइलों और निर्देशिकाओं को नाम में जगह देगा और अंतरिक्ष को एक अंडरस्कोर के साथ बदल देगा। चूँकि यह ग्लोब फ़ाइल से मेल खाता है जिसके लिए आपको शुरुआत करने के लिए सही निर्देशिका में होना चाहिए।

यदि आप अपने द्वारा किए जा सकने वाले पुनरावर्ती मैच करना चाहते हैं, लेकिन आपको renameनिर्देशिकाओं में किसी भी आइटम को पकड़ने के लिए एक दो बार निष्पादित करना पड़ सकता है, जिसे स्वयं का नाम बदला गया है:

cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!

2
" renameकी जगह द्वारा निर्दिष्ट फ़ाइलों का नाम होगा पहले की घटना से करके उनके नाम पर करने के लिए तो यह सिर्फ़ अपने नाम में एक भी स्थान के साथ फ़ाइलों के लिए काम करेगा।"। (आप renameलूप में कॉल कर सकते हैं , लेकिन यह वास्तव में यहां सही उपकरण नहीं है।)
गिल्स एसओ- बुराई को रोकें '

2

एक अन्य विकल्प होगा mmv, यदि स्थापित हो।

mmv \*\ \* \#1_#2

यह केवल पहले स्थान को एक में बदलता है _, यह कई स्थानों के साथ काम नहीं करता है।
गिल्स एसओ- बुराई को रोकना '

ओह, तुम सही हो। गलतफहमी के लिए खेद है।
glglgl

1

डेबियन / उबंटू पर, कालेब और गिल्स के उत्तर पर निर्माण, यह वही है जो मेरे लिए फाइलों को फिर से नाम बदलने के लिए काम करता है:

cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **

नोट: पूर्वावलोकन करने के लिए क्या फ़ाइलों का नाम बदला जाएगा और कैसे, के -nसाथ स्विच का उपयोग करें rename:

rename -n 's/ /_/g' **

एक और नोट: की स्थापना globstarबनाता है **सभी सबडायरेक्टरियों में फ़ाइलों से मेल खाते हैं, इसलिए यदि केवल वर्तमान निर्देशिका वांछित है, सेट globstar नहीं है या का उपयोग *करने के बजाय **

एक और ध्यान दें: renameखोज शब्द की कई घटनाओं वाली फ़ाइलों के लिए कमांड को एक से अधिक बार चलाने की आवश्यकता है।


केवल तभी काम करता है जब निर्देशिकाओं में स्थान नहीं होते हैं। (के नाम बदलने a b/c dके लिए a_b/c_dकाम नहीं होता है, तो आप का नाम बदलने का पहला आवश्यकता होगी a b/c dकरने के लिए a b/c_d, और उसके बाद a bके लिए a_b)।
स्टीफन चेज़लस

@ स्टेफेन: क्या इसका मतलब एक ही renameकमांड को दो बार चलाना है ?
मार्कस साइकेड्ट

खैर, और अधिक के रूप में कई बार के रूप में रिक्त स्थान के साथ निर्देशिकाओं के नेस्टेड स्तर हैं। आदर्श रूप से, आप पहले निर्देशिका की गहराई को पार करना चाहते हैं, और स्वीकृत समाधान की तरह फ़ाइल का केवल नाम बदलना। यह भी ध्यान दें कि बैश को **डॉटफाइल्स से बाहर रखा गया है और सहानुभूति का पता लगाता है।
स्टीफन चेज़लस

0

यदि आप नियमित अभिव्यक्तियों पर फ्लैश नहीं कर रहे हैं (मैं नहीं!), और आप केडी के लिए डिज़ाइन किए गए एप्लिकेशन चला सकते हैं (या तो आप केडी - के डेस्कटॉप का उपयोग करते हैं या आपके पास यह लाइब्रेरी स्थापित है), तो क्रैनैम एक महान चित्रमय उपयोगिता है आपको परिवर्तनों से पहले और बाद में देखने देता है । इसमें विकल्पों के रूप में कई सरल परिवर्तन हैं और नियमित अभिव्यक्तियों का भी समर्थन करता है। तुम भी एक नाम में कई अनुक्रमिक परिवर्तनों को जोड़ सकते हैं ताकि आप एक भी जटिल परिवर्तन है कि यह सब एक ही बार में डिजाइन करने की जरूरत नहीं है। इसके पास एक ही नाम बदलने के बाद एक ही फाइल को जारी रखने का विकल्प भी है।

मैं इसका उपयोग अक्सर नहीं करता, लेकिन जब मैं करता हूं, तो यह वास्तव में जल्दी और आसानी से काम पूरा कर लेता है। यह वास्तव में काम में आता है जब विभिन्न डाउनलोड की गई मीडिया फ़ाइलों का नाम बदला जाता है ताकि आप उन्हें अपने सिस्टम पर समान रूप से प्रबंधित कर सकें। यह krename मैनुअल को अलग से डाउनलोड करने में मदद करता है ताकि आप प्रोग्राम का उपयोग करते समय इसे संदर्भित कर सकें।

http://www.krename.net/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.