অনুলিপি করার সময় কীভাবে ফাইলের নাম পরিবর্তন করবেন?


12

নাম থেকে এলোমেলো স্ট্রিং অংশটি সরানোর জন্য প্রতিটি ফাইলের নাম পরিবর্তন করার সময় আমি কীভাবে (আর্কাইভ স্টাইল যেখানে তারিখ পরিবর্তন হয় না) ব্যবহারকারীর ডিরেক্টরিতে সমস্ত ফাইল নকল করব (উদাহরণস্বরূপ, -2b0fd460_1426b77b1ee_-7b8e)?

সিপি থেকে:

/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

প্রতিটি ফাইল সর্বদা "এরপ" দিয়ে শুরু হবে। তারিখ-সময় স্ট্যাম্প স্ট্রিং এর পরে এলোমেলো স্ট্রিং এবং তারপরে ".etf" এক্সটেনশন। আমি তারিখের স্ট্যাম্প সহ সমস্ত নাম উপাদান রাখতে চাই। আমি কেবল এলোমেলো স্ট্রিং সরাতে চাই।

এলোমেলো স্ট্রিং একই ফাইলের একাধিক ব্যাকআপ নিতে দেয়। যাইহোক, এই ক্ষেত্রে, আমি কেবল fdupes চালিয়েছি এবং কোনও নকল নেই। সুতরাং আমি এলোমেলো স্ট্রিং সরিয়ে সমস্ত ফাইলকে পুনঃস্থাপন করতে পারি।

এটি করার জন্য আমি এক-লাইন বাশ কমান্ডের সন্ধান করছি।

যদি এটি কাজ না করে, আমি এটি দুই বা ততোধিক পদক্ষেপে করতে পারি। আমি সাধারণত KRename ব্যবহার করি তবে এই ক্ষেত্রে আমার এটি ব্যাশ করা দরকার। (আমি দূর থেকে কাজ করছি।)

উত্তর:


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:

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

এইভাবে প্রতিটি ফাইলের জন্য আলাদা প্রক্রিয়া শুরু হয় না।


1
আমি দেখতে পাচ্ছি যে আমার সাথে পরিচিত হওয়া দরকার pax। এটি দেখতে খুব দরকারী একটি সরঞ্জামের মতো। কেন এটি আরও ডিস্ট্রোজে স্ট্যান্ডার্ড নয় তা আমাকে অবাক করে তোলে ...
মাউন্টেনএক্স

উইকিপিডিয়া অনুসারে @ মাউন্টেনএক্স, ভাল প্রশ্ন, pax২০০৫ সাল থেকে লিনাক্স স্ট্যান্ডার্ড বেসে রয়েছে। প্লাস cpioহ'ল এর বিকল্প হ'ল জিএনইউ সম্ভবত অস্তিত্বের সবচেয়ে কম বৈশিষ্ট্যযুক্ত জিএনইউ সরঞ্জাম।
গ্রীম

1
আপনার শেষ সমাধানের জন্য +1 এবং এইভাবে প্রতিটি ফাইলের জন্য আলাদা প্রক্রিয়া শুরু হয় না। তবে rename ফেডোরা / রেড হ্যাট এর থেকে আলাদা: এই ক্ষেত্রে এটি কীভাবে ব্যবহার করতে হয় তা আমি জানি না।
এরিক

15

আপনি বিকল্পটি cpদিয়ে কমান্ডটি ব্যবহার করতে পারেন-a

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

এবং তারপরে সমস্ত ফাইলের অনুলিপি করার জন্য লুপের জন্য একটি ব্যবহার করুন:

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

প্রস্তুত. উত্স ডিরেক্টরিতে এই কমান্ডটি শুরু করুন।

ব্যাখ্যা:%%-* একটি হাইফেন প্রথম occurence পর সমস্ত অক্ষর কেটে দেব / বিয়োগ -এবং .etfশেষে আবার ফাইল এক্সটেনশন যোগ করা হয়েছে।

ভাল, এবং একটি লাইনার হিসাবে, সব এক লাইনে রাখুন। :-) এটার মত

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

1
ধন্যবাদ, আপনি দয়া করে টিপটির জন্য ডকুমেন্টেশন উদ্ধৃত করতে পারেন %%-*? আমি কৌতুহলী.
soyuka

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 না থাকলে একটি পসিক্স ওয়ে প্যাক্স ব্যবহার করে (এটি ডিরেক্টরিগুলি পুনরাবৃত্তভাবে অনুলিপি করে)।

আপনি যদি কোনও zsh এবং কোনও প্যাক্সহীন একটি সীমাবদ্ধ সিস্টেমে থাকেন তবে আপনি একটি লুপ ব্যবহার করতে পারেন:

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

1

cpযে ক্ষমতা নেই। আমি cpioতা করতে সক্ষম হলাম মনে করি, তবে বর্তমান ম্যানপেজটি অন্যথায় বলে says তবে, (gnu) এর tarএকটি --transformবিকল্প রয়েছে:

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

সুতরাং আপনার মতো একটি সেমিডলাইন থাকে:

(cd /backup/path/data; tar --create --transform 's/-.*-....//' .) | (cd /home/user/data; tar --extract)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.