किसी फ़ोल्डर में फ़ाइलों को क्रमिक संख्याओं में बदलना


230

मैं अनुक्रमिक संख्याओं में एक निर्देशिका में फ़ाइलों का नाम बदलना चाहता हूं। फ़ाइलों की निर्माण तिथि के आधार पर।

उदाहरण के sadf.jpgलिए 0001.jpg, wrjr3.jpgकरने के लिए 0002.jpgऔर इतने पर, फ़ाइलों की कुल राशि के आधार पर अग्रणी शून्य की संख्या (यदि आवश्यक नहीं है तो अतिरिक्त शून्य की आवश्यकता नहीं है)।


मैं stackoverflow.com/questions/880467/… को देख रहा हूँ, लेकिन मुझे वह काम मेरे लिए नहीं मिल रहा है।
गन्नत

1
लिनक्स / यूनिक्स एक निर्माण तिथि को संग्रहीत नहीं करता है।
अगली सूचना तक रोक दिया गया।

1
ls -1tr | नाम बदलें -v / s.*/ हमारी $ i; अगर ($ i) {$ i = 1;} स्प्रिंटफ ("% 04d.jpg", $ i ++) / e '
maXp

जवाबों:


313

एक लूप का उपयोग करने का प्रयास करें let, और printfपैडिंग के लिए:

a=1
for i in *.jpg; do
  new=$(printf "%04d.jpg" "$a") #04 pad to length of 4
  mv -i -- "$i" "$new"
  let a=a+1
done

-iध्वज का उपयोग मौजूदा फ़ाइलों को स्वचालित रूप से अधिलेखित करने से रोकता है।


4
आप printf -v new "%04d.jpg" ${a}वैरिएबल में वैल्यू डालने के लिए भी कर सकते हैं । और ((a++))चर को बढ़ाने के लिए काम करता है। इसके अलावा, यह निर्माण की तारीख के आदेश को नहीं करता है या उन पेडिंग को कम करता है जो ओपी निर्दिष्ट चीजें हैं। हालांकि, यह ध्यान दिया जाना चाहिए कि लिनक्स / यूनिक्स एक निर्माण तिथि को स्टोर नहीं करता है।
अगली सूचना तक रोक दिया गया।

3
मेरे बैश वातावरण में काम करने के लिए एमवी को डबल कोट लपेटने की जरूरत है। mv "$ {i}" "$ {नया}"
गैरी थॉमन

2
बस साइग्विन हो सकता है (हालांकि यह टर्मिनल व्यवहार सामान्य यूनिक्स गोले के समान है) लेकिन यह फ़ाइल नाम में रिक्त स्थान होने पर एक समस्या है।
Geesh_SO

2
यह संभवत: mv -- "$i" "$new"स्रोत फ़ाइलनामों को सही ढंग से संभालने के लिए उपयोग करने के लिए वांछनीय होगा जो डैश के साथ शुरू होते हैं; जैसा कि यह है, mvझंडे के संग्रह के रूप में ऐसे फाइलनामों को पार्स करने की कोशिश करेंगे।
चार्ल्स डफी

2
मैंने एक झलक में लगभग 800 फाइलें खो दी हैं। मुझे लगता -iहै कि उत्तर में शामिल किया जाना चाहिए और नोट को तदनुसार लिखा जाना चाहिए। यह अधिक सुरक्षित होगा। :(
क्रिश्ना

269

एक पंक्ति में सौंदर्य:

ls -v | cat -n | while read n f; do mv -n "$f" "$n.ext"; done 

आप बदल सकते हैं .extके साथ .png, .jpgआदि


4
किंवदंती :), मैंने खिड़कियों पर गिट शेल पर इसका उपयोग किया, महान काम करता है! ^^।
Mr.K

4
बहुत अच्छा काम करता है। एक पंक्ति में सौंदर्य। मैंने कहा कि पिछले संशोधित समय द्वारा फ़ाइलें प्राप्त करें।
रंजीथ सिजी

32
इस तरह ls | cat -n | while read n f; do mv "$f" `printf "%04d.extension" $n`; done
प्रिंटफ़

8
चेतावनी: आप -nगलती से ओवरराइटिंग फ़ाइलों को रोकने के लिए mv कमांड में जोड़ना चाह सकते हैं । इस कठिन तरीके की खोज की!
इयान दानफोर्थ 3

4
इस उत्तर और अन्य पर टिप्पणियों से कुछ महान विचारों को एक साथ लाना: ls -1prt | grep -v "/$" | cat -n | while read n f; do mv -n "${f}" "$(printf "%04d" $n).${f#*.}"; done परिणाम: (1) संशोधन के क्रम में क्रमबद्ध, बाद में अन्य अनुक्रमित फाइलों के साथ; (2) निर्देशिकाओं को अनदेखा करता है - और पुनरावर्ती नहीं; (3) पैड इंडेक्स; (4) मूल विस्तार बनाए रखता है।
जॉर्ज

63

मुझे इसकी सरलता के लिए गौते का समाधान पसंद है, लेकिन इसमें एक महत्वपूर्ण कमी है। हजारों फाइलों पर चलने पर, आप "तर्क सूची बहुत लंबी" संदेश ( इस पर अधिक ) प्राप्त कर सकते हैं, और दूसरा, स्क्रिप्ट वास्तव में धीमी हो सकती है। मेरे मामले में, यह लगभग 36.000 फाइलों पर चल रहा है, स्क्रिप्ट लगभग चली गई। एक आइटम प्रति सेकंड! मुझे वास्तव में यकीन नहीं है कि ऐसा क्यों होता है, लेकिन मुझे सहयोगियों से जो नियम मिला वह " findआपका मित्र है"

find -name '*.jpg' | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command

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


7
मैंने NRएक छोटी कमांड के लिए पंक्ति संख्या का उपयोग करने के लिए संशोधित किया । gawk '{ printf "mv %s %04d.jpg\n", $0, NR }'
एपीवेट चेंटाविबुल

12
यहाँ भारी सुरक्षा कमजोरियाँ। इस बारे में सोचें कि क्या आपके पास कोई फ़ाइल है $(rm -rf /).jpg
चार्ल्स डफी

चार्ल्स को इंगित करने के लिए धन्यवाद। क्या आप एक सुरक्षित समाधान सुझा सकते हैं?
beibei2 17

2
फ़ाइल नाम में रिक्त स्थान होने पर टूट जाता है। स्रोत फ़ाइलनाम के आसपास उद्धरणों का उपयोग करें। Printf "mv \"% s \ "% 04d.jpg \ n", $ 0, a ++
बेसकिन

1
forपाश फ़ाइल प्रति 1 सेकंड नहीं ले रही है, सख्ती से बोला। फ़ाइल सिस्टम से 36,000 फ़ाइल नामों को लाने के लिए एक लंबा समय लग रहा है, फिर उन पर यथोचित रूप से जल्दी से लूप। कई फ़ाइल सिस्टम में बड़ी निर्देशिकाओं के साथ समस्याएँ हैं, चाहे आप कितनी भी सटीक कमांड चलाएं; लेकिन आम तौर पर, findशेल वाइल्डकार्ड की तुलना में अधिक तेज़ होने वाला है क्योंकि इसे मिलान फ़ाइलों की सूची को प्राप्त करना और सॉर्ट करना है।
ट्रिपल

30

"नाम बदलें" आदेश के साथ

rename -N 0001 -X 's/.*/$N/' *.jpg

या

rename -N 0001 's/.*/$N.jpg/' *.jpg

32
मेरे rename(लिनक्स मिंट 13) के पास कोई -Nविकल्प नहीं है ।
ल्यूक एच

मैं सिर्फ नाम बदलने के आदेश का उल्लेख कर सकता हूं, मैंने इसके बारे में कभी नहीं सुना है
user907860

8
मुझे यह जानने में दिलचस्पी है कि किसी को -N विकल्प के साथ नाम बदलने की आज्ञा कहाँ मिलती है। मेरे Ubuntu 14.04 यह नहीं है।
Stephan Henningsen

1
मुझे renameकमान से प्यार है , लेकिन मुझे इसके बारे में कभी नहीं पता था -N! धन्यवाद!
डैन लेकोक

1
कर रहे हैं कम से कम तीन अलग अलग रूप में जाना जाता उपकरणrename । @Bostrot द्वारा पोस्ट किया गया लिंक अभी तक एक और नया नाम है और ऐसा लगता है कि @RomanRhrnNesterov ने इसका इस्तेमाल किया है। renameperl-renamerename$Nperl-rename '$N=sprintf("%04d",++$N); s/.*/$N.jpg/' *.jpg
Er पेडर स्ट्राय

30

OSX पर पेरो के समाधान का उपयोग करने के लिए कुछ संशोधन की आवश्यकता थी। मैंनें इस्तेमाल किया:

find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash

ध्यान दें: लाइन निरंतरता के लिए बैकस्लैश हैं

20 जुलाई, 2015 को संपादित करें: रिक्त स्थान के साथ फ़ाइलनाम का समर्थन करने के लिए कमांड के \"%s\"तर्क को उद्धृत करने के लिए @ क्लेस्टोफर की प्रतिक्रिया को शामिल किया गया mv


3
पेरो के समाधान की तरह, यहां सुरक्षा कमजोरियां हैं। इस बारे में सोचें कि क्या आपके पास कोई फ़ाइल है $(rm -rf /).jpg
चार्ल्स डफी

धन्यवाद, यह काम करता है। लेकिन आपको पहले तर्क को उद्धृत करना चाहिए mv। यदि आपके पास एक फाइल है जिसका नाम some thing.jpgआपकी स्क्रिप्ट है तो वह विफल हो जाती है। यह वही है जो मैंने इस्तेमाल किया है:find . -name '*.jpg' | awk 'BEGIN{ a=0 }{ printf "mv \"%s"\ wallpaper-%04d.jpg\n", $0, a++ }' | bash
कलस्टोफर

मैं शायद -maxdepth 1वर्तमान निर्देशिका में केवल jpgs पर काम करना चाहूंगा , क्योंकि यह खेद से सुरक्षित होना बेहतर है।
पीटर पेराह

यदि आप पिछली पंक्ति के अंत में पाइप वर्ण को स्थानांतरित करते हैं, तो आपको किसी भी बैकस्लैश की आवश्यकता नहीं है।
ट्रिपल

आप ls -1 *.jpgखोजने के बजाय उपयोग कर सकते हैं, अन्यथा इसे छाँटा नहीं जाएगा। या |sort|इससे पहले एक awk
JPT

28

एक बहुत ही साधारण बैश एक लाइनर जो मूल एक्सटेंशन रखता है, अग्रणी शून्य जोड़ता है, और OSX में भी काम करता है:

num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done

Http://ubuntuforums.org/showthread.php?t=1355021 का सरलीकृत संस्करण


ठीक वही जो मेरे द्वारा खोजा जा रहा था। मुझे पसंद है कि आप स्टार्ट इंडेक्स सेट कर सकते हैं।
जैक विले

2
कृपया ध्यान दें कि यह फाइलों का मूल क्रम नहीं रखेगा ।
रॉय शीलक्रॉट

@RoyShilkrot » से क्या मतलब है आप मूल आदेश को नहीं रखेंगे «? बैश और अन्य पॉज़िक्स गोले में दस्ताने सिस्टम के स्थान के अनुसार क्रमबद्ध क्रम में विस्तारित होते हैं। बेशक, यह 9.extपहले सॉर्ट नहीं करता है 11.ext, लेकिन अन्य उपकरण (जैसे ls) ऐसा नहीं करेंगे।
सोकोवि

11

सभी स्थितियों में काम करने के लिए, उन फ़ाइलों के लिए एक \ "डालें जिनके नाम में जगह है

find . -name '*.jpg' | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash

3
वास्तव में सभी स्थितियों को कवर नहीं करता है। शाब्दिक उद्धरणों वाले एक फ़ाइलनाम से आप बच सकते हैं - और चूंकि आप एकल उद्धरणों के बजाय दोहरे उद्धरण चिह्नों का उपयोग कर रहे हैं, जैसे विस्तार $(rm -rf /)अभी भी सम्मानित हैं।
चार्ल्स डफी

11

यदि आपका renameसमर्थन नहीं करता है -N, तो आप ऐसा कुछ कर सकते हैं:

ls -1 -c | xargs rename -n 's/.*/our $i; sprintf("%04d.jpg", $i++)/e'

संपादित करें किसी दिए गए नंबर से शुरू करने के लिए, आप नीचे दिए गए (कुछ बदसूरत दिखने वाले) कोड का उपयोग कर सकते हैं, बस 123 को अपनी इच्छित संख्या से बदल दें:

ls -1 -c | xargs rename -n 's/.*/our $i; if(!$i) { $i=123; } sprintf("%04d.jpg", $i++)/e'

यह क्रिएशन टाइम के हिसाब से फाइलों को सूचीबद्ध करता है (सबसे पहले नया, -rls को रिवर्स सॉर्ट में जोड़ें ), फिर फाइलों की इस सूची को नाम बदलने के लिए भेजता है। नाम बदलने और काउंटर बढ़ाने के लिए regex में पर्ल कोड का उपयोग करता है।

हालाँकि, यदि आप EXEG जानकारी के साथ JPEG छवियों के साथ काम कर रहे हैं, तो मैं सुझाऊंगा exiftool

यह " रिनेमिंग एग्जाम्स " के तहत, एक्सफ़ॉलिट डॉक्यूमेंटेशन से है

   exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir

   Rename all images in "dir" according to the "CreateDate" date and time, adding a copy number with leading '-' if the file already exists ("%-c"), and
   preserving the original file extension (%e).  Note the extra '%' necessary to escape the filename codes (%c and %e) in the date format string.

मैं एक विशिष्ट संख्या का उपयोग करके कैसे शुरू कर सकता हूं rename?
जन

6

OSX पर , होमब्रे से नाम बदलें स्क्रिप्ट स्थापित करें:

brew install rename

तब आप इसे वास्तव में आसानी से हास्यास्पद रूप से कर सकते हैं:

rename -e 's/.*/$N.jpg/' *.jpg

या एक अच्छा उपसर्ग जोड़ने के लिए:

rename -e 's/.*/photo-$N.jpg/' *.jpg

3
यह एक महान स्क्रिप्ट है, और यह केवल पर्ल पर निर्भर करता है। काढ़ा केवल macs पर काम करता है, लेकिन आप इसे github ( github.com/ap/rename ) से पकड़ सकते हैं और लिनक्स या विंडोज पर इसका इस्तेमाल कर सकते हैं ।
टिम डैनर

3
यह मेरे लिए काम नहीं करता है। मुझे मिलाGlobal symbol "$N" requires explicit package name (did you forget to declare "my $N"?) at (user-supplied code).
एंथनी चुंग

एक मैक उपयोगकर्ता के रूप में, मुझे यह रिपोर्ट करते हुए खुशी हो रही है कि @TimDanner द्वारा लिंक किया गया नाम बदलकर सुपर पोर्टेबल है, ज़िप संग्रह को डाउनलोड करना उतना ही आसान था, नाम बदलने की उपयोगिता को एक निर्देशिका में छोड़ देना, जहां मेरा बैश प्रोफ़ाइल पथ देखने के लिए सेट है , और यह सही बॉक्स से बाहर काम करता है। मुझे आश्चर्य है कि यह MacPorts पर उपलब्ध नहीं है। मुझे यह बहुत अजीब लगता है कि मेरे पास Rename (2) के लिए एक BSD मैनपेज है, लेकिन जब नाम बदला गया तो यह कहेंगे कि कोई कमांड मौजूद नहीं है। जाओ पता लगाओ।
1

2

अनुक्रम का अनुसरण करने के लिए सभी फ़ाइलों का नाम बदलें और एक्सटेंशन को भी कम करें:

rename --counter-format 000001 --lower-case --keep-extension --expr='$_ = "$N" if @EXT' *

1

मेरे पास एक समान मुद्दा था और उस कारण के लिए एक शेल स्क्रिप्ट लिखी। मैंने इसे ध्यान में रखते हुए पोस्ट करने का फैसला किया है क्योंकि कई अच्छे उत्तर पहले से ही पोस्ट किए गए थे क्योंकि मुझे लगता है कि यह किसी के लिए मददगार हो सकता है। इसे सुधारने के लिए स्वतंत्र महसूस करें!

गिनना

@Gnutt आप जिस व्यवहार को चाहते हैं, उसे निम्न टाइप करके प्राप्त किया जा सकता है:

./numerate.sh -d <path to directory> -o modtime -L 4 -b <startnumber> -r

यदि विकल्प -rछोड़ दिया जाता है तो रीमिंग केवल नकली होगी (परीक्षण के लिए सहायक होनी चाहिए)।

ओशन एल लक्ष्य संख्या की लंबाई का वर्णन करता है (जो कि अग्रणी शून्य से भरा जाएगा) विकल्पों के साथ एक उपसर्ग / प्रत्यय जोड़ना भी संभव है -p <prefix> -s <suffix>

यदि कोई व्यक्ति चाहता है कि फ़ाइलों को क्रमांकित होने से पहले संख्यात्मक रूप से क्रमबद्ध किया जाए, तो -o modtimeविकल्प को हटा दें ।



1

आइए मान लें कि हमारे पास ये फाइलें एक निर्देशिका में हैं, जो सृष्टि के क्रम में सूचीबद्ध है, जो सबसे पुरानी है:

a.jpg
b.JPG
c.jpeg
d.tar.gz
e

तो ls -1crऊपर सूची में बिल्कुल आउटपुट। आप तब उपयोग कर सकते हैं rename:

ls -1cr | xargs rename -n 's/^[^\.]*(\..*)?$/our $i; sprintf("%03d$1", $i++)/e'

जो आउटपुट देता है

rename(a.jpg, 000.jpg)
rename(b.JPG, 001.JPG)
rename(c.jpeg, 002.jpeg)
rename(d.tar.gz, 003.tar.gz)
Use of uninitialized value $1 in concatenation (.) or string at (eval 4) line 1.
rename(e, 004)

एक्सटेंशन के बिना फ़ाइलों के लिए "अनइंस्टाल्यूटेड वैल्यू [...]" का उपयोग प्रदर्शित किया जाता है; आप इसे अनदेखा कर सकते हैं।

वास्तव में नाम बदलने के लिए आदेश -nसे निकालें rename

यह उत्तर ल्यूक के अप्रैल 2014 के उत्तर से प्रेरित है । यह फ़ाइलों की कुल मात्रा के आधार पर प्रमुख शून्य की संख्या को सेट करने के Gnutt की आवश्यकता को अनदेखा करता है।


यह मेरे लिए यहां सबसे उपयोगी जवाब था, ज्यादातर इसलिए क्योंकि मैं इसे चलाने से पहले सेशन को ड्राय-रन करना चाहता था, और इसलिए भी कि मैं ls -1tUसृजन समय के लिए बदलकर ऑर्डर को ट्यून कर सकता था। इसे भी renameस्थापित करने की आवश्यकता थी , जो मेरे पास नहीं था।
एंटनी

1

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

हालांकि, कुछ मामलों में आपको नाम से कुछ तार्किक आदेश प्राप्त करने की आवश्यकता है, जिसका उपयोग इस उदाहरण में किया गया है।

find -name '*.jpg' | sort -n | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command 

3
इसका उपयोग न करें। इस तरह से मारपीट करना एक बड़े पैमाने पर सुरक्षा जोखिम है। क्या होगा यदि फ़ाइल नाम का कोई एक रूप है blahblah; rm -r * blahblah.jpg?
xhienne

1

समय के आधार पर छाँटे गए, jpg तक, प्रमुख शून्य और एक बेसनैम (यदि आप संभवतः एक चाहते हैं तो)

ls -t *.jpg | cat -n |                                           \
while read n f; do mv "$f" "$(printf thumb_%04d.jpg $n)"; done

(सभी एक पंक्ति में, बिना \)


चीजों की भव्य योजना में, इस पृष्ठ पर कई उत्तर भयानक हैं, इसलिए शायद यह विशेष रूप से पतन के लायक नहीं है। मैं किसी भी चीज का उपयोग करने में संकोच करता हूं जो lsएक स्क्रिप्ट में उपयोग करता है, हालांकि।
ट्रिपल

मैं इस जवाब को नकारात्मक पक्ष से बचाता हूं, जबकि शायद नाजुक, यह एक विशिष्ट उपयोग-केस के लिए काम करता है जो मेरे पास था।
विले

1
ls -1tr | rename -vn 's/.*/our $i;if(!$i){$i=1;} sprintf("%04d.jpg", $i++)/e'

नाम बदलें -वन - परीक्षण मोड के लिए n हटाएं

{$ i = 1;} - नियंत्रण प्रारंभ संख्या

"% 04d.jpg" - नियंत्रण गणना शून्य 04 और आउटपुट एक्सटेंशन सेट करें ।jpg


इस उत्तर को अपनाना क्योंकि यह केवल मूल नाम का उपयोग करता है। मेरा उपयोग मामला पहले दो अंकों की फाइलों को 01:rename -v -n 's/../our $i;if(!$i){$i=1;} sprintf("%02d", $i++)/e' *
मिनट से कम

1

मेरे लिए उत्तरों के इस संयोजन ने पूरी तरह से काम किया:

ls -v | gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | bash
  • ls -v 1 10 9 को सही तरीके से ऑर्डर करने में मदद करता है: 1 9 10 ऑर्डर, जेपीजी जेपीजी जेपीईजी के साथ फ़ाइल नाम एक्सटेंशन की समस्याओं से बचना
  • gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }'4 वर्णों और अग्रणी शून्य के साथ पुन: बनाता है। एमवी से बचने के द्वारा मैं गलती से किसी भी चीज़ को ओवरराइट करने की कोशिश नहीं करता हूं जो पहले से ही गलती से एक ही नंबर है।
  • bash कार्यान्वित

@Xhienne ने क्या कहा, इस बात से अवगत रहें कि अज्ञात कंटेंट को कोसने के लिए पाइप करना एक सुरक्षा जोखिम है। लेकिन मेरे लिए ऐसा नहीं था क्योंकि मैं अपनी स्कैन की हुई तस्वीरों का इस्तेमाल कर रहा था।


0

आप ls का भी उपयोग कर सकते हैं

ls *.JPG| awk 'BEGIN{ a=0 }{ printf "mv %s gopro_%04d.jpg\n", $0, a++ }' | bash

5
Mywiki.wooledge.org/ParsingLs देखें , और दूसरे पर सुरक्षा कमजोरियों का वर्णन भी, इसी तरह टूटे हुए समाधान।
चार्ल्स डफी

1
इसका उपयोग न करें। इस तरह से मारपीट करना एक बड़े पैमाने पर सुरक्षा जोखिम है। क्या होगा यदि फ़ाइल नाम का कोई एक रूप है blahblah; rm -r * blahblah.JPG?
१२:२enne बजे xhienne

0

अन्य समाधानों का अधिकांश हिस्सा मौजूदा फाइलों को पहले से ही एक संख्या के रूप में नामित करेगा। यह विशेष रूप से एक समस्या है यदि स्क्रिप्ट को चलाना, अधिक फ़ाइलों को जोड़ना, और फिर स्क्रिप्ट को फिर से चलाना।

यह स्क्रिप्ट पहले संख्यात्मक फाइलों का नाम बदल देती है:

#!/usr/bin/perl

use strict;
use warnings;

use File::Temp qw/tempfile/;

my $dir = $ARGV[0]
    or die "Please specify directory as first argument";

opendir(my $dh, $dir) or die "can't opendir $dir: $!";

# First rename any files that are already numeric
while (my @files = grep { /^[0-9]+(\..*)?$/ } readdir($dh))
{
    for my $old (@files) {
        my $ext = $old =~ /(\.[^.]+)$/ ? $1 : '';
        my ($fh, $new) = tempfile(DIR => $dir, SUFFIX => $ext);
        close $fh;
        rename "$dir/$old", $new;
    }
}

rewinddir $dh;
my $i;
while (my $file = readdir($dh))
{
    next if $file =~ /\A\.\.?\z/;
    my $ext = $file =~ /(\.[^.]+)$/ ? $1 : '';
    rename "$dir/$file", sprintf("%s/%04d%s", $dir, ++$i, $ext); 
}

0

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

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

ध्यान रखें कि यदि आपके पास फ़ाइल नाम टकराव है, तो आप फ़ाइलें खो रहे हैं। तो पहले कुछ अजीब तरह का नाम बदलें temp001.jpgऔर फिर अपने अंतिम फ़ाइल नाम पर अमल करें।

DIGITS=$(ls | wc -l | xargs | wc -c | xargs); ls -tcr | cat -n | while read n f; do mv "$f" "$(printf "%0${DIGITS}d" $n).${f##*.}"; done

1
lsएक बार नहीं बल्कि दो बार दौड़ने से ऐसा लगता है कि इससे बचा जाना बेहतर था, लेकिन मैंने किसी भी गहराई से इसका अध्ययन नहीं किया है।
ट्रिपल

1. यदि मैं जानबूझकर एक oneliner का प्रस्ताव करता हूं, तो आप इसे बाद में क्यों बदलते हैं? मेरे जैसे कई उपयोगकर्ता किसी कार्य को पूरा करने के लिए एक ऑनलाइनर को कॉपी-पेस्ट करना पसंद करते हैं। दूसरों को लाइन से लाइन पर कॉपी करना पसंद करते हैं, इस धागे में अन्य उत्तर हैं। 2. मूल प्रश्न था "फाइलों की कुल मात्रा के आधार पर अग्रणी शून्य की संख्या" और यह पहले द्वारा किया गया है ls, इसलिए यही कारण है कि उनमें से दो की आवश्यकता है। 3. इस तरह के आदेश एक-शॉट हैं और लिपियों में शामिल करने के लिए नहीं हैं, इसलिए एक कारण है कि लोग एक-लाइनर्स को पसंद करते हैं
फ़्लावियो आइलो

1
क्षमा करें, आपको यह महसूस नहीं हुआ कि यह महत्वपूर्ण था। मेरे लिए, कोड को पढ़ने में सक्षम होने के नाते यह एक ही पंक्ति के रूप में कॉपी / पेस्ट करने की क्षमता को ट्रम्प करता है। मुझे ऐसा वातावरण नहीं मिला है जहां बैश में एक पेस्ट की समस्या होती है जो कई लाइनों को फैलाता है, लेकिन मैं कुछ अनदेखी कर सकता हूं।
ट्रिपल

0

यहाँ मेरे लिए क्या काम किया है।
मैंने नाम बदलकर कमांड का उपयोग किया है ताकि अगर किसी भी फ़ाइल में इसके नाम पर रिक्त स्थान हो, तो mv कमांड रिक्त स्थान और वास्तविक फ़ाइल के बीच भ्रमित न हो।

यहां मैंने सभी jpg फ़ाइलों के लिए '_' के साथ एक फ़ाइल नाम में रिक्त स्थान, '' को प्रतिस्थापित किया है
#! / Bin / bash
'y / / _ /' का नाम बदलें * jpg # _ के साथ रिक्त स्थान
चलो x = 0;
मैं में * .jpg; के लिए
    चलो x = (x + 1)
    mv $ i $ x.jpg
किया हुआ

Linux (ubuntu), "sudo apt install rename"
रिशंग भावसार

0

आजकल आपके पास नाम बदलने के लिए कई फ़ाइलों का चयन करने के बाद एक विकल्प है (मैंने थुनर फ़ाइल प्रबंधक में देखा है)।

  1. कई फ़ाइलों का चयन करें
  2. विकल्पों की जाँच करें
  3. नाम का चयन करें

एक संकेत उस विशेष डीआईआर में सभी फाइलों के साथ आता है बस श्रेणी अनुभाग के साथ जांचें


-1

यह स्क्रिप्ट मैक ओएस बैश पर निर्माण तिथि के अनुसार फाइलों को सॉर्ट करेगी। मैं इसे बड़े पैमाने पर वीडियो का नाम बदलने के लिए उपयोग करता हूं। बस नाम का विस्तार और पहला भाग बदलें।

ls -trU *.mp4| awk 'BEGIN{ a=0 }{ printf "mv %s lecture_%03d.mp4\n", $0, a++ }' | bash

1
इसका उपयोग न करें। इस तरह से मारपीट करना एक बड़े पैमाने पर सुरक्षा जोखिम है। क्या होगा यदि फ़ाइल नाम का कोई एक रूप है blahblah; rm -r * blahblah.mp4?
xhienne

-1

यहाँ "नाम बदलें" कमांड के साथ एक और समाधान:

find -name 'access.log.*.gz' | sort -Vr | rename 's/(\d+)/$1+1/ge'

अग्रणी शून्य बहाल करने के लिए:rename 's/(\d+)/sprintf("%04d",$1)+1/ge'
कैमिल गौडेय्यून

अपेक्षा के अनुरूप काम नहीं करता है, एक फ़ोल्डर के लिए जिसमें इस तरह के नाम के साथ फाइल होती है: DSC_3451.JPG, DSC_3452.JPG आदि खोज -name '* .JPG' | सॉर्ट -Vr | नाम बदलें / (\ d +) / $ 1 + 1 / ge 'कुछ भी संशोधित नहीं करता है
Tiberiu C.

-2

पेरो का जवाब मुझे यहाँ मिला :)

मैं समय के सापेक्ष फ़ाइलों का नाम बदलना चाहता था क्योंकि छवि दर्शक समय क्रम में छवियों को प्रदर्शित नहीं करते थे।

ls -tr *.jpg | # list jpegs relative to time
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command

2
इसका उपयोग न करें। इस तरह से मारपीट करना एक बड़े पैमाने पर सुरक्षा जोखिम है। क्या होगा यदि फ़ाइल नाम का कोई एक रूप है blahblah; rm -r * blahblah.jpg? बस एक चरम उदाहरण है।
13


-3

6000 को फिर से चालू करने के लिए, एक फ़ोल्डर में फ़ाइलें आप एसीडीसी कार्यक्रम के 'नाम बदलें' विकल्प का उपयोग कर सकते हैं।

एक उपसर्ग को परिभाषित करने के लिए इस प्रारूप का उपयोग करें: ####"*"

फिर स्टार्ट नंबर सेट करें और Rename दबाएं और प्रोग्राम क्रमिक नंबरों के साथ सभी 6000 फाइलों का नाम बदल देगा।


1
ओपी यूनिक्स बॉर्न शेल में आदेशों का एक सेट मांगता है। आप एक व्यावसायिक उत्पाद का प्रस्ताव कर रहे हैं जो केवल विंडोज़ वातावरण में चलता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.