एक regex के साथ लिनक्स में फ़ाइलों का नाम बदलना


9

मेरे पास फ़ाइलों का एक समूह है जिसे मैं लगातार नाम देना चाहूंगा, फाइलों को चीजों का नाम दिया जाता है

"System-Log-01-01-2009-NODATA.txt"
"Something-Log-01-01-2009-NODATA.txt"

और मैं उन्हें लोअरकेस, yyyymmdd, .log एक्सटेंशन के रूप में चाहता था

"system.20090101.log"
"something.20090101.log"

जवाबों:


14

मैंने ऐसा करने के लिए पर्ल स्क्रिप्ट्स लिखीं, जब तक कि मैंने नाम बदलने की कमान नहीं खोज ली।

यह नाम बदलने के लिए एक पर्ल रेगेक्स स्वीकार करता है:

इसके लिए, मैंने अभी दो कमांड टाइप की हैं:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log

हालांकि कुछ डिस्ट्रोस के लिए, renameयह कार्यक्षमता नहीं है (इसके मैन पेज देखें), और आपको इंस्टॉल perl-renameया करना पड़ सकता है prename


बहुत अच्छा जवाब
Judioo

8
खबरदार, कुछ डिस्ट्रोस एक बेकार नाम बदलने की आज्ञा देते हैं। जाँच करें कि आपके पहले कौन से डिस्ट्रो है।
derobert

मुझे पता था mmvलेकिन अंततः renameमैं रेगेक्स की शक्ति का उपयोग कर सकता हूं
लुडोविक क्रूट

5
आर्क लिनक्स पर यह है perl-rename
ओलेह प्रीपिन

6

चूँकि मेरे पास नाम बदलने की आज्ञा नहीं है, इसलिए मैं इस पर भरोसा कर रहा हूँ:

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done

5

एमएमवी कई फाइलों को स्थानांतरित / नाम बदलने के लिए एक मानक लिनक्स उपयोगिता है। यह अधिकांश वितरण के लिए भंडार से उपलब्ध है। ऊपर आपके उदाहरण के लिए, आप यह कर सकते हैं:

mmv *-Log-*-*-*-NODATA.txt #l1.#4#3#2.log

अधिक जानकारी के लिए, इस debaday लेख या मैन पेज को पढ़ें ।


5

renameउपयोग बहुत "मानक" नहीं है। प्रत्येक डिस्ट्रो जहाज एक अलग renameउपकरण के साथ। उदाहरण के लिए, यहाँ Gentoo, पैकेज renameसे sys-apps/util-linuxहै और रेगेक्स का समर्थन नहीं करता है।

हैमिश डाउनर ने सुझाव दिया mmv, यह उपयोगी लगता है, विशेष रूप से स्क्रिप्ट के अंदर उपयोग के लिए।

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

दोनों mmvऔर qmvपरिपत्र renames पता लगाने के लिए सही क्रम में फ़ाइलों का नाम है और यह भी करने के लिए स्मार्ट पर्याप्त हैं, और यदि आवश्यक हो तो स्वचालित रूप से एक अस्थायी फ़ाइल कर देगा।


जेंटू पर आप sys-apps/renameपैकेज को भी उभर सकते हैं , जो आपको देता है renamexmजो रेगेक्स नाम बदलने के साथ-साथ बड़े पैमाने पर ऊपरी / लोअरकेस और अन्य अच्छी चीजें करेगा।
रेडिकैंड

1

निष्पक्ष तौर पर:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *.txt

यह आउटपुट देता है:

Use of uninitialized value $4 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $3 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $2 in regexp compilation at (eval 1) line 1.

परंतु:

rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/A-Z/a-z/' System.20090101.log

सही आउटपुट देता है:

System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log

{-n} स्विच को {-v} के साथ बदलना


1

मैंने ऐसा करने के लिए एक छोटी सी बैश स्क्रिप्ट बनाई:

#!/bin/bash

for f in `ls /path/to/folder`; do
  # Create new filename from the old one
  # This example replaces A (upper case) with a (lower case)
  new_file=`echo "$new_file" | tr A a`

  # Rename the file
  mv "$f" "$new_file"
done

सामान्य पार्सिंग lsआउटपुट में यह सबसे अच्छा विचार नहीं है। एक यादृच्छिक खोज ने यूनिक्स पर पढ़े गए इस लोंगिश को खींच लिया आपके मनोरंजन के लिए एसई । | इसके अलावा आपका उत्तर बेहतर प्रश्न के साथtr '[:upper:]' '[:lower:]'
HBruijn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.