फ़ाइलों का नाम बदलें


25

मेरे पास कई फाइलें हैं:

10.3.100.179_01_20161018_230014_5335.jpg
10.3.100.179_01_20161018_231514_0814.jpg
10.3.100.179_01_20161018_233014_5706.jpg
10.3.100.179_01_20161018_234514_0896.jpg
10.3.100.179_01_20161018_230114_5395.jpg
10.3.100.179_01_20161018_231614_1145.jpg
10.3.100.179_01_20161018_233114_6047.jpg
10.3.100.179_01_20161018_234614_0547.jpg
10.3.100.179_01_20161018_230114_5492.jpg
10.3.100.179_01_20161018_231614_1264.jpg
10.3.100.179_01_20161018_233114_6146.jpg
10.3.100.179_01_20161018_234614_0658.jpg
10.3.100.179_01_20161018_230214_5630.jpg
10.3.100.179_01_20161018_231714_7135.jpg

मैं इस प्रारूप का नाम बदलना चाहता हूं:

10.4.100.135_01_20161013131108389_TIMING.jpg
10.4.100.135_01_20161013131111390_TIMING.jpg
10.4.100.135_01_20161013131114401_TIMING.jpg
10.4.100.135_01_20161013131117431_TIMING.jpg
10.4.100.135_01_20161013131120418_TIMING.jpg
10.4.100.135_01_20161013131123461_TIMING.jpg
10.4.100.135_01_20161013131126511_TIMING.jpg

इसे _टाइमस्टैम्प में निकालने और जोड़ने की जरूरत है _TIMING



5
कृपया अपने प्रश्नों में लगातार उदाहरणों का उपयोग करें। ऐसा लगता है कि आप बदलना चाहते 10.3.100.179साथ 10.4.100.135। क्या यह है कि आप क्या चाहते हैं या क्या आप समय से _TIMINGऔर दूर करना चाहते हैं _?
टेराडॉन

3
लोगों को यह याद दिलाने के लिए एक अच्छा समय है कि तिथियों के लिए एक iso8601 मानक है (जो फ़ाइल नाम और लॉग प्रविष्टियों के लिए दोनों काम करता है) ^ ^ तो शायद आपको पुनर्नामित होने के लिए पुनर्विचार करना चाहिए: YYYY-MM-DDThh: mm: ss.mmm (ex : आपकी पहली फ़ाइल बन जाएगी: 10.4.100.135_01_2016-10-13T13:11:08.389_TIMING.jpg(और "टाइमिंग" तब भी हटाया जा सकता है, क्योंकि यह अब स्पष्ट रूप से एक तिथि और घंटे (और मिलीसेकंड) की तरह दिखता है, खासकर जब मानक अधिक व्यापक हो जाता है। टी मानक का हिस्सा है और मैं इसे पसंद करने के लिए बड़ा हुआ (और इसे बाहर ले जाना मानक तोड़ देता है ^ ^)
ओलिवियर दुलैक

@OlivierDulac मैं :फ़ाइल नाम में उपयोग करने की अनुशंसा नहीं करूंगा । मेरा मानना ​​है कि विंडोज इसका समर्थन नहीं करता है।
जस्टिन

@ जस्टिन अच्छी बात है। मानक फ़ाइल नाम के लिए इसे छोड़ने की सलाह देते हैं। मैंने इन-फ़ाइल संस्करण दिया
ओलिवियर डुलैक

जवाबों:


38

अपने पसंदीदा टेक्स्ट एडिटर के साथ इंस्टॉल renameutilsऔर उपयोग करें qmv

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

मैं आमतौर पर करता हूं:

$ qmv -f do

ताकि यह नामों के सिर्फ एक स्तंभ को दर्शाता है (करें: गंतव्य-केवल)। यहाँ है कि यह कैसा दिखता है:

qmw

यदि आप इसे SublimeText, Atom या Visual Studio Code के कई कर्सर के साथ जोड़ते हैं, तो यह बल्क नामकरण के लिए बहुत अच्छा और शक्तिशाली उपकरण बनाता है। उदाहरण के लिए, एटम के लिए, आप करेंगे EDITOR="atom -w" qmv -f do


1
AskUbuntu में आपका स्वागत है! यह बहुत अच्छा है!
α atsнιη

यह सिर्फ + पर हस्ताक्षर किए! यह। ;)
जे। एलन

2
वाह, अच्छा उपकरण और अच्छा GIF एनीमेशन। शानदार पहला उत्तर, आपका स्वागत है! :)
बाइट कमांडर

1
इमेज को लाइक करने के लिए @KasiyA को धन्यवाद और बाकी सभी को पॉजिटिव कमेंट्स के लिए धन्यवाद।
एटिजेलो

1
@kasperd हां, यह चेतावनी देगा कि नाम बदलने की योजना में त्रुटियां हैं और एक इंटरैक्टिव कंसोल खोलें जहां आगे की कार्रवाई की जा सकती है।
एटिजेलो

27

उपयोग करें rename...

rename -n 's/^([0-9]+\.[0-9]\.[0-9]+\.[0-9]+_[0-9]+_)([0-9]+)_([0-9]+)_([0-9]+)\.jpg/$1$2$3$4_TIMING\.jpg/' *

इसके साथ -nयह बिना किसी बदलाव के क्या करने वाला है:

rename(10.3.100.179_01_20161018_230014_5335.jpg, 10.3.100.179_01_201610182300145335_TIMING.jpg)
rename(10.3.100.179_01_20161018_231514_0814.jpg, 10.3.100.179_01_201610182315140814_TIMING.jpg)
rename(10.3.100.179_01_20161018_233014_5706.jpg, 10.3.100.179_01_201610182330145706_TIMING.jpg)
rename(10.3.100.179_01_20161018_234514_0896.jpg, 10.3.100.179_01_201610182345140896_TIMING.jpg)

यदि यह सही लगता है, तो हटा दें -n

$ rename 's/^([0-9]+\.[0-9]\.[0-9]+\.[0-9]+_[0-9]+_)([0-9]+)_([0-9]+)_([0-9]+)\.jpg/$1$2$3$4_TIMING\.jpg/' *
$ ls
10.3.100.179_01_201610182300145335_TIMING.jpg  10.3.100.179_01_201610182330145706_TIMING.jpg
10.3.100.179_01_201610182315140814_TIMING.jpg  10.3.100.179_01_201610182345140896_TIMING.jpg

यह समझाते हुए ...

  • s/something/something_else/ खोजें और बदलें
  • ^ नाम की शुरुआत (एंकरिंग)
  • [0-9] कोई संख्या
  • + पूर्ववर्ती चरित्र का एक या अधिक
  • \.शाब्दिक .( \यह किसी भी वर्ण से मेल खाता है)
  • () इस भाग को रखने के लिए
  • $1$2$3$3 वापस मेल की गई चीजों का संदर्भ और पहले रखा गया ()

नोट: *कमान के अंत में वर्तमान निर्देशिका में सभी दृश्यमान फाइलों का मिलान किया जा रहा है। यदि आवश्यक हो तो अधिक उपयुक्त ग्लोब का उपयोग करें।


2
कुछ डिस्ट्रोस पर, यह कमांड prename(pl perl के लिए उपलब्ध है , क्योंकि पहला arg एक पर्ल एक्सप्रेशन है)
पीटर कॉर्ड्स

12

mmv इसे निम्नानुसार कर सकते हैं:

mmv '*_*_*_*_*.jpg' '#1_#2_#3#4#5_TIMING.jpg'

10.3.100.179_01_20161018_230014_5335.jpg 10.3.100.179_01_201610182300145335_TIMING.jpg

# 1, # 2, # 3, ... हर एक को यहाँ मेल खाने वाले '*' के लिए संदर्भित कर रहा है।

यह इससे भी छोटा है:

mmv '*_*_*.jpg' '#1#2#3_TIMING.jpg'

9

एक और renameतरीका:

$ rename -n 's/(.*)_(.*)_(.*)\./$1$2$3_TIMING./' *
10.3.100.179_01_20161018_230014_5335.jpg -> 10.3.100.179_01_201610182300145335_TIMING.jpg
10.3.100.179_01_20161018_230114_5395.jpg -> 10.3.100.179_01_201610182301145395_TIMING.jpg
10.3.100.179_01_20161018_230114_5492.jpg -> 10.3.100.179_01_201610182301145492_TIMING.jpg
10.3.100.179_01_20161018_230214_5630.jpg -> 10.3.100.179_01_201610182302145630_TIMING.jpg
10.3.100.179_01_20161018_231514_0814.jpg -> 10.3.100.179_01_201610182315140814_TIMING.jpg
10.3.100.179_01_20161018_231614_1145.jpg -> 10.3.100.179_01_201610182316141145_TIMING.jpg
10.3.100.179_01_20161018_231614_1264.jpg -> 10.3.100.179_01_201610182316141264_TIMING.jpg
10.3.100.179_01_20161018_231714_7135.jpg -> 10.3.100.179_01_201610182317147135_TIMING.jpg
10.3.100.179_01_20161018_233014_5706.jpg -> 10.3.100.179_01_201610182330145706_TIMING.jpg
10.3.100.179_01_20161018_233114_6047.jpg -> 10.3.100.179_01_201610182331146047_TIMING.jpg
10.3.100.179_01_20161018_233114_6146.jpg -> 10.3.100.179_01_201610182331146146_TIMING.jpg
10.3.100.179_01_20161018_234514_0896.jpg -> 10.3.100.179_01_201610182345140896_TIMING.jpg
10.3.100.179_01_20161018_234614_0547.jpg -> 10.3.100.179_01_201610182346140547_TIMING.jpg
10.3.100.179_01_20161018_234614_0658.jpg -> 10.3.100.179_01_201610182346140658_TIMING.jpg

यदि ऐसा लगता है कि जैसा आप चाहते हैं, उसे हटा दें -n


5

आप निम्न का भी उपयोग कर सकते हैं। पहले अपनी फ़ाइलों का बैकअप लें और यह प्रयास करें:

find . -name "*.jpg" -type f -print0| while read -d $'\0' file
do
    #extension="${file##*.}"
    newfilename=$(echo "${file%.*}" | sed 's/\(.*\)_\(.*\)_/\1\2/')
    mv "$file" "$newfilename""_TIMING.jpg"
done

sed 's/\(.*\)_\(.*\)_/\1\2/')_टाइमस्टैम्प में पात्रों को हटाता है ।

उदाहरण के लिए:

user@host$ ls -lart
total 8
drwxrwxr-x 6 user user 4096 Oct 21 10:21 ..
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230014_5335.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231514_0814.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233014_5706.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234514_0896.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230114_5395.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231614_1145.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233114_6047.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234614_0547.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230114_5492.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231614_1264.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233114_6146.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234614_0658.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230214_5630.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231714_7135.jpg
drwxrwxr-x 2 user user 4096 Oct 21 10:30 .

user@host$ find . -name "*.jpg" -type f -print0 | while read -d $'\0' file
> do
>  newfilename=$(echo "${file%.*}" | sed 's/\(.*\)_\(.*\)_/\1\2/')
>  mv $file $newfilename"_TIMING.jpg"
> done

10:35:20 t $ ls -lart
total 8
drwxrwxr-x 6 user user 4096 Oct 21 10:21 ..
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182300145335_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182315140814_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182330145706_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182345140896_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182301145395_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182316141145_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182331146047_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182346140547_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182301145492_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182316141264_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182331146146_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182346140658_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182302145630_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182317147135_TIMING.jpg
drwxrwxr-x 2 user user 4096 Oct 21 10:35 .

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

@ ग्रिडकोगिटंस: यदि आप एक आधुनिक लिनक्स सिस्टम (यानी उबंटू के किसी भी संस्करण) पर हैं, तो कमांड-लाइन की लंबाई की सीमा कई मेगाबाइट है। और अगर यह एक समस्या है, तो आप find -maxdepth 1 -exec rename ... {} +मौजूदा निर्देशिका की सूची का नाम बदलने के लिए कमांड लाइन का उपयोग कर सकते हैं । ( -name *.jpgया जो आप चाहते हैं उसमें जोड़ें )। यह एक शेल लूप की तुलना में बहुत तेजी से निष्पादित करेगा जो कि केवल नाम बदलने के लिए कॉल सिस्टम के बजाय फोर्क्स + निष्पादित करता है sedऔर mvप्रत्येक फ़ाइलनाम के लिए। (आप sedबैश के अंतर्निहित रेगेक्स सामान का उपयोग करके छुटकारा पा सकते हैं , लेकिन फोर्किंग mvअभी भी धीमी गति से ईश है।)
पीटर कॉर्डेस

2

आप शायद समाप्त हो गए हैं, लेकिन यहाँ (सरल) सभी bashसमाधान हैं:
"सरल ... बैश समाधान" एक ऑक्सीमोरोन है?

#!/bin/bash

#loop through all files ending in .jpg
for f in *.jpg;
do

    #cut out everything to the timestamp
    firsthalf=${f%_*_*_*}

    #get from the timestamp on
    lasthalf=${f#*_*_}

    #remove (all) underscores from timestamp
    #note the 2 forward slashes...
    lasthalf=${lasthalf//_/}

    #get our extension
    ext=${lasthalf##*.}

    #now we can remove the extension
    lasthalf=${lasthalf%.*}

    #rename the file
    #change `mv` to `echo` if you want to do a trial run first...
    mv "$f" "${firsthalf}_${lasthalf}_TIMING.${ext}"

done;

पुनश्च: लूप में तर्क आपके एक उदाहरण फ़ाइल नाम के साथ परीक्षण किया गया था। यह गुजर गया।


1
शायद [[ $f ~= (.*)_(.*)_(.*)_(.*)\.jpg ]]; newname=${BASH_REMATCH[1]${BASH_REMATCH:2:4}TIMING.jpgया कुछ के साथ एक बैश रेगेक्स का उपयोग करने के लिए बेहतर है। (पूरी तरह से अप्रयुक्त और शायद गलत है, लेकिन सामान्य विचार यह है कि कैप्चर समूह BASH_REMATCH सरणी में जाते हैं।)
पीटर

@PeterCordes: यह एक अच्छी बात है! मैंने कभी भी bashसमूहों पर कब्जा नहीं किया है , और पूरी तरह से ईमानदार होने के लिए, बैश पहली भाषा नहीं है जिसके साथ मैं उनकी कोशिश करूंगा। (मुझे लगता bashहै कि एक बदसूरत भाषा है।) फिर भी, यह एक अच्छा समाधान है और इसने मुझे कुछ यों सिखाया है।
जे। एलन

हाँ, शुद्ध बैश में इतना टेक्स्ट प्रोसेसिंग करने का मुख्य कारण टैब-फ़ंक्शंस को लिखना है जो तेज़ होना चाहिए। यह "बदसूरत कोड" वाक्यांश के लिए एक नया अर्थ लाता है ...
पीटर कॉर्ड्स

@PeterCordes: मुझे आपकी बात अच्छी लगी, हालाँकि मुझे नहीं लगता कि यह कोड "बदसूरत" है। यह आपके द्वारा दिए गए 2 लाइन समाधान नहीं हो सकता है, लेकिन जहां तक ​​मेरा सवाल है, इसे पढ़ना मुश्किल नहीं है; इसके अलावा यह अच्छी तरह से टिप्पणी की है ...
जे। एलन

मैं सामान्य रूप से बदसूरत कोड के बारे में बात कर रहा था जो बदसूरत था (या कम से कम पढ़ने के लिए कठिन था)। यह वास्तव में बदसूरत नहीं है, बस कुछ हद तक झुकने वाली (जैसे कि एक चर नाम से रेफरी द्वारा किए गए आघात से गुजरता है और कैली का उपयोग होता हैprintf -v "$3" ... चर जिसका नाम है उसे सेट होता है $3।) पूरी कमांड लाइन को अलग करके इसे वापस लाना। साथ में पालन करना / डिबग करना काफी कठिन है, कम से कम मैंने इसे इस तरह से पाया कि इसे साफ करने / कीड़े को ठीक करने की कोशिश कर रहा हूं। जीथब पर कोड
पीटर कॉर्ड्स

1

यदि आप GUI का उपयोग कर सकते हैं, तो मैं pyRenamer की सिफारिश करूंगा

यह अधिकांश वितरणों में मौजूद है, उबंटू में फाई:

sudo apt-get install pyrenamer

यह सब आप चाहते हैं और अधिक कर सकते हैं।

  • यह पैटर्न का उपयोग कर सकता है, पाठ जोड़ या दबा सकता है।
  • यह फ़ोटो का नाम बदलने पर EXIF ​​डेटा तक पहुंच सकता है, इसलिए आप दिनांक / समय, आदि के आधार पर पैटर्न उत्पन्न कर सकते हैं ...
  • संगीत फ़ाइलों का नाम बदलकर कुछ मेटाडेटा का उपयोग कर सकते हैं।
  • इसके अलावा, यह एक है पूर्वावलोकन है , जो कुछ गलतियों को पलटना मुश्किल हो सकता है।

Downvoter करने के लिए ... देखभाल करने के लिए क्यों? ओपी ने निर्दिष्ट नहीं किया कि जीयूआई एक विकल्प था या नहीं। मुझे लगता है कि अधिकांश उत्तर कंसोल / स्क्रिप्ट तरीके से चलते हैं, लेकिन कई उपयोगकर्ता GUI समाधान की सराहना करेंगे। या शायद pyRenamer में कुछ दोष है जिसकी मुझे जानकारी नहीं है। किसी भी मामले में, मुझे डाउनवोट के कारणों को जानना पसंद है।
ज्यार्ताब

हो सकता है कि मैं एक तड़क-भड़क वाले इंटरैक्टिव GUI दृष्टिकोण के लिए थुनर बल्क रेनमर का सुझाव भी दूं।
टोनी मार्टिन

@TonyMartin इस प्रश्न के तहत टिप्पणी की जानी चाहिए, इसका उत्तर से कोई लेना-देना नहीं है
Sergiy Kolodyazhnyy

0

यहाँ अपने कच्चे निर्मित find + xargs+sed + mvओनेलाइनर (प्यार करने वाला) है:

find . -name "*.jpg" -print0 | sort -z | xargs -0 sh -c 'for filename; do mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g"); done' sh

स्पष्टीकरण:

  • find . -name "*.jpg" | sort | xargs sh -c <command> sh : सभी जेपीईजी को वर्तमान निर्देशिका में सूचीबद्ध करें, फिर प्रत्येक के लिए एक शेल कमांड निष्पादित करें (छांटना निश्चित रूप से वैकल्पिक है, लेकिन अगर आप कहीं लॉगिंग कर रहे हैं तो चीजों को थोड़ा साफ रखें)

  • -print0, -z, -0: यह द्विआधारी साथ अलग-अलग मदों के लिए अच्छी आदत है0 जब फ़ाइल नाम tokenizing इन-द-बीच व्हाइट-स्पेस (नहीं अपने मामले यद्यपि) के साथ समस्याओं से बचने के लिए

  • mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g");: ( sedregex में बैकस्लैश इसकी पठनीयता में मदद नहीं करता है, लेकिन यह सरल है) प्रत्येक फ़ाइल को उनके सन्निहित समवर्ती के साथ 8 + 6 + 4 अंकों के अंडरस्कोर-अनुक्रमित अनुक्रम को बदलकर नाम बदल दिया जाता_TIMING है ( \iयह एक बैकरेन्स टू है i) वें रेगेक्स समूह)।


Refs : Xargs - आदमी सेड

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