छवियों का नाम बदलने के लिए समय दें: अद्वितीय फ़ाइल नाम दें


11

यदि मैं एक्सफ़ के माध्यम से एक्सफ़ तारीख की तारीख में छवियों का नाम बदल देता हूं, तो मैं निम्नलिखित करता हूं:

find . -iname \*jpg -exec exiv2 -v -t -r '%Y_%m_%d__%H_%M_%S' rename {} \;

अब ऐसा हो सकता है कि तस्वीरों में बिल्कुल समान टाइमस्टैम्प (सेकंड सहित) हो। मैं फ़ाइल नाम को स्वचालित रूप से अद्वितीय कैसे बना सकता हूं?

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

मेरा पहला प्रयास परिणामी फ़ाइलनाम में मूल आधार को छोड़ने का था, लेकिन तब ऊपर के अर्थ में कमांड स्थिर नहीं होगी।


1
टाइमस्टैम्प निकालें, फ़ाइल नाम बनाएँ, मौजूदा फ़ाइल नाम के लिए जाँच करें, संशोधित करें (प्रत्यय या समान जोड़ें) यदि मौजूद है, तो mvफ़ाइल।
Kusalananda

क्या exiv2 कमांड में एक विकल्प जोड़कर भी अधिक सीधा रास्ता है?
छात्र

तो एक्सफ़िल्टूल का उपयोग करने वाला उत्तर कुछ इस तरह होगा exiftool '-filename<createdate' -d %Y_%m_%d__%H_%M_%S%%-c.%%le "-filemodifydate<createdate#" -r -progress .:। शायद आप अपनी टिप्पणी को एक उत्तर में बदल सकते हैं।
छात्र 5

जवाबों:


17

आप प्रयास कर सकते हैं jheadजो करता है बजाय कि बाहर के बॉक्स (के साथ a, b... zऔर @meuh ने उल्लेख किया स्थिरता मुद्दा नहीं है एक ही तिथि के साथ 27 फ़ाइलों के लिए अनुमति प्रत्यय):

find . -iname '*jpg' -exec jhead -n%Y_%m_%d__%H_%M_%S {} +

या exiftool(मैन पेज में उदाहरण) का उपयोग कर :

exiftool -ext jpg '-FileName<CreateDate' -d %Y_%m_%d__%H_%M_%S%%-c.%%e .

(यहाँ %-cएक संख्यात्मक प्रत्यय होने के साथ शुरू होता है -)


3

exiv2(0.25 001900) का मेरा संस्करण इंटरएक्टिव रूप से पूछेगा कि फ़ाइल नाम पहले से मौजूद होने पर क्या करना है।

exiv2: File `./2013_06_19__14_03_13.jpg' exists. [O]verwrite, [r]ename or [s]kip? 

विकल्प जोड़कर -Fयह स्वचालित रूप से नाम में एक अतिरिक्त _1(या _2आदि) जोड़ देगा ।

Renaming file to ./2013_06_19__14_01_53_1.jpg, updating timestamp

यदि कमांड दूसरी बार चलाया जाता है तो यह कहता है:

This file already has the correct name

और कुछ भी नहीं करता है, लेकिन अगर यह _1हिस्सा है, तो यह भ्रमित हो जाता है और इसका नाम बदल देगा _2। यह प्रत्येक रन पर गैर-विनाशकारी तरीके से इस तरह टॉगल करेगा। यदि आप चाहें, तो इसे अनदेखा कर सकते हैं, या अपने findपैटर्न को बदलकर फ़ाइलों को एक _भाग के साथ दिनांक पैटर्न से मेल खाने की उपेक्षा कर सकते हैं ।

उदाहरण के लिए, दिनांक प्रारूप के लिए रेगेक्स पैटर्न शुरू होता है [0-9]{4}_[0-9]{2}_...। सरल बनाने के लिए, मैं सेट से 20 वर्णों का मिश्रण खोजूंगा 0..9और _, जो कि regex है [0-9_]{20}। इसके लिए प्रत्यय _को देखने के लिए कम से कम 1 अंक का अनुसरण किया जाता है _[0-9]{1,}.jpg। चूंकि रेगेक्स को पूरे रास्ते से मेल खाना है, और सिर्फ बेसनेम नहीं, डायरेक्टरी सहित अंतिम रीजेक्स है .*/[0-9_]{20}_[0-9]{1,}.jpg

तो आप एक खोज का उपयोग कर सकते हैं जैसे:

find . -regextype posix-extended ! -iregex '.*/[0-9_]{20}_[0-9]{1,}.jpg' -iname '*.jpg' ...

1

Exiv2 इसे अपने आप संभाल सकता है। मैंने भी इस पर मदद की तलाश में बहुत समय बिताया, जब तक कि मैं exiv2 मैनुअल को देखने नहीं गया। -F विकल्प इस समस्या को हल करता है।

exiv2 -r'%Y_%m_%d__%H_%M_%S' -F *.jpg

यदि फ़ाइल पहले से मौजूद है तो यह अंत में एक _N को जोड़ देगा।

और थोज़ के लिए जो एक विकल्प की तलाश कर रहे हैं जो फ़ोल्डर बनाने की अनुमति देते हैं।

exiftool -r '-FileName<DateTimeOriginal' -d %Y/%m/%d/%%f%%-c.%%e *

0

Pyrenamer मेरे नए स्थापित Ubuntu 16.04 पर काम नहीं करेगा, इसलिए मुझे इस समस्या को हल करने के लिए एक और तरीका भी खोजना होगा।

मेरे पास एक फ़ोल्डर में IMG_0001.JPG, IMG_0002.JPG, ... जैसी फाइलें हैं। इस साइट की जाँच करें, /programming/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

पहले "exiv2" स्थापित करें, और मैंने निम्नलिखित कमांड लाइन लिखी:

$ में img के लिए (ls *। [jj] [pp] [gg] 2> / dev / null); do exiv2 -r '% Y% m% d_% H% M% S _' "$ (tmp = $ {img %%। *}; गूंज $ {tmp ## * _})" नाम बदलें "$ img"; किया हुआ

आउटपुट फ़ाइल नाम YYYYMMDD_HHMMSS_0001.JPG, YYYYMMDD_HHMMSS_0002.JPG, ... आदि हैं। यहां तक ​​कि फ़ोटो एक ही सेकंड में ली गई थीं, मूल फ़ोटो क्रमांक संख्या में फर्क पड़ेगा।

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