कॉपी करते समय फ़ाइलों का नाम कैसे बदलें?


12

मैं प्रतिलिपि कैसे बनाऊँगा (संग्रह शैली जहाँ दिनांक परिवर्तित नहीं हुई है) नाम से यादृच्छिक स्ट्रिंग भाग को हटाने के लिए प्रत्येक फ़ाइल को उपयोगकर्ता की निर्देशिका में एक बैकअप निर्देशिका में रखा जाता है (यानी -2b0fd460_1426b77b1ee_-7b8e)?

cp से:

/backup/path/data/Erp.2014.02.16_16.57.03-2b0fd460_1426b77b1ee_-7b8e.etf

सेवा:

/home/user/data/Erp.2014.02.16_16.57.03.etf

प्रत्येक फ़ाइल हमेशा "Erp" से शुरू होगी। रैंडम स्ट्रिंग के बाद डेट-टाइम स्टैम्प स्ट्रिंग और उसके बाद एक्सटेंशन ".etf"। मैं सभी नाम तत्वों को रखना चाहता हूं जिनमें तारीख-समय की मुहर शामिल है। मैं बस यादृच्छिक स्ट्रिंग को निकालना चाहता हूं।

यादृच्छिक स्ट्रिंग एक ही फ़ाइल के कई बैकअप की अनुमति देता है। हालाँकि, इस मामले में, मैं सिर्फ fdupes भागा और कोई डुप्लिकेट नहीं हैं। तो मैं बस सभी फाइलों को पुनर्स्थापित कर सकता हूं, यादृच्छिक स्ट्रिंग को हटा सकता हूं।

मैं इसे करने के लिए एक-लाइन बैश कमांड की तलाश कर रहा हूं।

अगर वह काम नहीं करेगा, मैं इसे दो या अधिक चरणों में कर सकता हूं। मैं सामान्य रूप से केरेनाम का उपयोग करता हूं, लेकिन इस मामले में मुझे इसे बाश में करने की आवश्यकता है। (मैं दूर से काम कर रहा हूं।)

जवाबों:


7

paxएक बार में यह सब कर सकते हैं। तुम यह कर सकते थे:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' Erp*etf /home/user/data

paxडिफ़ॉल्ट रूप से समय को संरक्षित करता है, लेकिन -peसब कुछ संरक्षित करने के लिए जोड़ सकता है (रूट के रूप में सबसे अच्छा किया जाता है) या -ppअनुमतियों को संरक्षित करने के लिए, उदाहरण के लिए:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' -pe Erp*etf /home/user/data

अन्यथा ( paxआमतौर पर डिफ़ॉल्ट रूप से उपलब्ध नहीं होता है), निश्चित रूप से कॉपी करना बेहतर होता है rename: a

cp -a /backup/path/data/Erp*.etf /home/user/data
rename 's/-.*$/.etf/' /home/user/data/Erp*.etf

इस तरह से प्रत्येक फ़ाइल के लिए एक अलग प्रक्रिया शुरू नहीं होती है।


1
मैं देख सकता हूं कि मुझे परिचित होने की जरूरत है pax। यह बहुत उपयोगी उपकरण की तरह दिखता है। मुझे आश्चर्य है कि बनाता है कारण है कि यह अधिक distros में मानक नहीं है ...
MountainX

@MountainX, विकिपीडिया के अनुसार, अच्छा सवाल, pax2005 से लिनक्स मानक बेस में रहा है। इसके अलावा इसके लिए वैकल्पिक विकल्प होगा, GNU cpio, संभवतः अस्तित्व में सबसे कम सुविधा वाला GNU उपकरण है।
ग्रीम

1
आपके अंतिम समाधान के लिए +1 और इस तरह से प्रत्येक फ़ाइल के लिए शुरू की गई एक अलग प्रक्रिया नहीं है। लेकिन rename फेडोरा / रेड हैट पर अलग है: मुझे नहीं पता कि इस मामले में इसका उपयोग कैसे करना है।
erik

15

आप विकल्प के cpसाथ कमांड का उपयोग कर सकते हैं-a

-a, --archive
       same as -dR --preserve=all

और फिर उन्हें कॉपी करते समय सभी फ़ाइलों का नाम बदलने के लिए एक लूप का उपयोग करें:

for file in Erp*etf; do
  cp -a $file destinationDirectory/${file%%-*}.etf
done

तैयार। इस आदेश को स्रोत निर्देशिका में प्रारंभ करें।

स्पष्टीकरण:%%-* एक हाइफन का पहला मामला के बाद सभी पात्रों कट जाएगा / शून्य से -और .etfअंत में फिर से फाइल एक्सटेंशन कहते हैं।

खैर, और एक लाइनर के रूप में, यह सब एक पंक्ति में डाल दिया। :-) ऐशे ही

for file in Erp*etf; do cp -a $file destinationDirectory/${file%%-*}.etf; done

1
धन्यवाद, क्या आप कृपया %%-*टिप के लिए प्रलेखन उद्धृत कर सकते हैं ? मैं उत्सुक हूँ।
सोयुका

3

Zsh में, उपयोग करें zmv। इसे अपने में रखें .zshrc:

autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'

फिर उपयोग करें

zcp '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

बैश में:

zsh -c 'autoload zmv; zmv -C $0 $1' '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

यदि आपके पास zsh नहीं है, तो POSIX तरीका pax का उपयोग करता है (यह प्रतियां निर्देशिका को पुनरावर्ती रूप से)।

यदि आप बिना zsh और pax वाले प्रतिबंधित सिस्टम पर हैं, तो आप एक लूप का उपयोग कर सकते हैं:

for source in /backup/path/data/*-*.etf; do
  basename=${source##*/}
  cp "$source" "/home/user/data/${basename%-*}.${basename##*.}"
done

1

cpउस क्षमता नहीं है। मुझे याद cpioहै कि ऐसा करने में सक्षम होने के नाते, लेकिन वर्तमान मेनपेज अन्यथा कहता है। हालाँकि, (gnu) के tarपास एक --transformविकल्प है:

 --transform, --xform EXPRESSION
       use sed replace EXPRESSION to transform file names

तो आपके पास एक cmdline होगा:

(cd /backup/path/data; tar --create --transform 's/-.*-....//' .) | (cd /home/user/data; tar --extract)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.