उन नामों को दर्ज करने के लिए पाठ जोड़ें जिनमें डॉट नहीं है


9

निम्नलिखित फ़ाइलों को देखते हुए:

english_api
english_overview
style.css

मैं पाना चाहता हूं:

english_api.html
english_overview.html
style.css

दूसरे शब्दों में, .टर्मिनल का उपयोग कर एक निर्देशिका के भीतर सभी फ़ाइलों के लिए एक पाठ संलग्न करने के लिए कैसे नहीं एक कंटेनर ( )।

जाहिर है कि उस फ़ोल्डर में बहुत सारी फाइलें हैं; मैंने सिर्फ एक उदाहरण के रूप में 3 लिखा था।

अगर मैं, करने के लिए देता है कहते हैं, की जगह थे .cssसाथ .htmlउस फ़ोल्डर में, मैं का प्रयोग करेंगे:

rename .css .html *.css

लेकिन मैं वास्तव में उन फ़ाइलों से मेल खाने का तरीका नहीं सोच सकता जिनमें कुछ नहीं है। यह भी कि renameकमांड का उपयोग करके (बनाम प्रतिस्थापित) कैसे जोड़ा जाए ?

जवाबों:


13

इस findआदेश का प्रयास करें ,

find . -type f ! -name "*.*" -exec mv {} {}.html \;

यह उन फ़ाइलों का नाम बदल देता है जिनमें वर्तमान फ़ाइल में मौजूद फ़ाइल नाम में इस filename.htmlप्रारूप में डॉट्स नहीं हैं ( अंतिम में जोड़े गए.html )।

. -> वर्तमान निर्देशिका का प्रतिनिधित्व करता है

-type f -> इस ऑपरेशन को केवल फाइलों पर करने के लिए।

! -name "*.*" -> उन फ़ाइलों का नाम प्रिंट करें जिनके नाम में डॉट्स नहीं हैं।

-exec mv {} {}.html -> findआदेश निकाले गए फ़ाइल नाम पर इस कदम (या) का नाम बदलें ऑपरेशन करते हैं।

\; -> findकमांड के अंत का प्रतिनिधित्व करता है ।


6

बैश में, आप विस्तारित शेल ग्लब्स जैसे उपयोग कर सकते हैं

for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; done

( echoआपके द्वारा पुष्टि किए जाने के बाद यह सही पैटर्न से मेल खाता है) को हटा दें । यदि विस्तारित ग्लोबिंग पहले से सक्षम नहीं है, तो आप इसे सक्षम कर सकते हैं shopt -s extglob

एक अन्य विकल्प renameएक रेगेक्स के साथ पर्ल-आधारित फ़ंक्शन का उपयोग कर रहा है जो शाब्दिक को बाहर करता है.

rename -nv 's/^[^.]+$/$&.html/' path/to/files/*

( nएक बार विकल्प की पुष्टि करने के बाद इसे सही पैटर्न से हटा दें )।


for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; doneकमांड निर्देशिका का नाम भी बदल देता है।
अविनाश राज

2

इस तरह के मामलों में मेरी पसंद है mmv। यह उबंटू में डिफ़ॉल्ट रूप से स्थापित नहीं है, लेकिन आप sudo apt-get install mmvकमांड का उपयोग करके इंस्टॉल कर सकते हैं ।

आपके मामले में आपको इसे दो बार उपयोग करने की आवश्यकता है:

  1. .htmlप्रत्येक फ़ाइल नाम के अंत में जोड़कर वर्तमान निर्देशिका से सभी फ़ाइलों का नाम बदलें :

    mmv -v '*' '#1.html'
    
  2. फिर से नाम बदलें (पीछे) सभी फाइलें जो पहले उनके नाम एक या अधिक .(डॉट्स) थीं :

    mmv -v '*.*.html' '#1.#2'
    

या, एक पंक्ति में:

mmv -v '*' '#1.html' && mmv -v '*.*.html' '#1.#2'

-vविकल्प अनिवार्य नहीं है। मैं इसे केवल एक वर्बोज़ आउटपुट के लिए उपयोग करता हूं क्योंकि इसके बिना यह mmvचुपचाप कार्रवाई करता है।

man mmvअधिक जानकारी के लिए देखें ।


1

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

prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *

-2

जवाब एकदम सही हैं, मैं आपको एक और कमांड देता हूं जो यह काम करता है:

ls -1 | grep -v "\." | awk '{print "mv "$0" "$0".html"}' | sh

कुछ स्पष्टीकरण:

ls - list directory contents

 -1     list one file per line

grep prints the matching lines.

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

Awk is mostly used for pattern scanning and processing. It searches one or more files to see if they contain lines that matches with the specified patterns and then perform associated actions.

ध्यान दें :

मैं आपके परिदृश्य की कोशिश करता हूं और कमांड काम करता है।


6
यह उन फ़ाइल नामों पर विफल होता है जिनमें किसी भी प्रकार के व्हाट्सएप (रिक्त स्थान, टैब, नईलाइन आदि) होते हैं। एक सामान्य नियम के रूप में, आपको कभी भी पार्स नहीं करना चाहिएls
टेर्डन

आपकी टिप्पणी के लिए थैंक्स राइट टेर्डन धन्यवाद, लेकिन मैं इसे एक ही कमांड में कैसे हल कर सकता हूं
नक्स

3
तुम सच में नहीं कर सकते। Ls को पार्स करने का लगभग कोई सुरक्षित तरीका नहीं है । यदि आप वास्तव में इसका उपयोग करना चाहते हैं awkऔर sh, कुछ ऐसा प्रयास करें printf "'%s'\n" -- !(*.*) | awk '{print "mv -- "$0" "$0".html"}' | sh। यह अभी भी नए नामों के साथ फ़ाइल नामों पर टूट जाएगा, लेकिन कम से कम यह रिक्त स्थान से निपट सकता है। उन --मामलों के लिए आवश्यक है जहां आपके पास शुरुआत के साथ फाइल नाम हैं -
टेराडॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.