আমি কীভাবে ওয়াইল্ডকার্ড দ্বারা একাধিক ফাইল অনুলিপি করব?


42

আমার এটিবিসিতে বেশ কয়েকটি ফাইল সহ একটি ফোল্ডার রয়েছে * * (এখানে প্রায় 100 টি ফাইল রয়েছে)। DEF দিয়ে শুরু হওয়া নামগুলির সাথে আমি তাদের সকলকে নতুন ফাইলগুলিতে নকল করতে চাই *

তাই আমি চাই

ABC.Page1
ABC.Page2
ABC.Topic12
...etc

অনুলিপি

DEF.Page1
DEF.Page2
DEF.Topic12
...etc

ব্যাচ কমান্ড (BASH বা অনুরূপ ক্ষেত্রে) দিয়ে এটি করার সহজ উপায় কী? আমি সেড বা অ্যাজক বা জার্গস সম্পর্কিত কিছু ভাবছি, তবে সিনট্যাক্সটি বের করতে আমার অসুবিধা হচ্ছে। আমি পাইথন স্ক্রিপ্ট লিখতে পারি, তবে আমি ভাবছি সম্ভবত একটি কমান্ড লাইন সমাধান রয়েছে যা খুব জটিল নয়।


mcএই নামকরণের পুনঃনামকরণের জন্য কোনও বদনামযোগ্য ফাইল ম্যানেজারের সর্বাধিক বিস্তৃত সমর্থন রয়েছে।
ওকাদ

@ ওকাদ tarকোনও বসন্ত-মুরগি নয়। একটি উদাহরণের জন্য আমার উত্তর দেখুন।
মাইকজার্ভ

উত্তর:


41

বাশে এই জাতীয় কিছু সম্পর্কে কীভাবে:

for file in ABC.*; do cp "$file" "${file/ABC/DEF}";done

আপনি সিপি কমান্ডের সামনে ইকো রেখে পরীক্ষা করতে পারেন:

for file in ABC.*; do echo cp "$file" "${file/ABC/DEF}";done

নিখুঁত। এমনকি আমি কল্পনাও করা সহজ।
অক্টোপাস

এটি বেশিরভাগ ক্ষেত্রেই যথেষ্ট ভাল তবে প্রতিধ্বনির সাহায্যে পরীক্ষা করা এখানে গুরুত্বপূর্ণ। এটি কোনও স্ক্রিপ্টে কখনই করবেন না । আরও তথ্যের জন্য বাশ
pawel7318

@ pawel7318, আপনি যে লিঙ্কটি দিয়েছেন, দুর্দান্ত পরামর্শ দেওয়ার পরেও উপরোক্ত আদেশটি প্রযোজ্য বলে মনে হচ্ছে না। শুধুমাত্র প্রান্ত মামলা আমি এই কমান্ড দিয়ে দেখতে হয়: (1) চেক না করে তাহলে লক্ষ্য ফাইল আগে থেকেই আছে কিংবা লক্ষ্য ফাইল আগে থেকেই হিসেবে যদি উপস্থিত থাকে ডিরেক্টরি (যা ফাইল কপি হবে মধ্যে ডিরেক্টরি, তার বর্তমান নাম সংরক্ষণের), এবং (2) যদি এমন অনেকগুলি ফাইল থাকে যে গ্লোব সম্প্রসারণ একক কমান্ড লাইনে ফিট করতে পারে না।
ওয়াইল্ডকার্ড

1
আমি এটি পেয়েছি: cp /usr/local/lib/libboost* /usr/local/lib/libboost*ইকো চেক সহ।
টোমা জাটো

8

বিপুল সংখ্যক ফাইলের সাথে দক্ষতার সাথে এটি cpকরতে প্রত্যেকের জন্য আলাদা প্রক্রিয়া শুরু করা এড়ানো ভাল । একটি উপায় হ'ল অনুলিপি করার পরে তাদের পুনরায় নামকরণ করা হবে prename( renameএটি ডেবিয়ান ভিত্তিক ডিস্ট্রোজে ডিফল্টরূপে সিমলিঙ্কযুক্ত)। এটি এবং লিনাক্স ব্যবহার করে mktemp:

tmp=$(mktemp -d --tmpdir=.)
cp ABC.* "$tmp"
prename "s:$tmp/ABC:DEF:" "$tmp/"*
rmdir "$tmp"

হালনাগাদ

আসলে paxএখানে যাওয়ার আরও ভাল উপায় হতে পারে:

pax -rws '/^ABC/DEF/' ABC.* .

দুর্ভাগ্যক্রমে, paxপসিআইএসএক্স এবং লিনাক্স স্ট্যান্ডার্ড বেস উভয় হওয়া সত্ত্বেও কয়েকটি ডিস্ট্রো বর্তমানে এটি ডিফল্টরূপে অন্তর্ভুক্ত করে।


এটিকে ব্যবহার করে দুর্দান্ত স্পর্শ: পলায়ন এড়ানোর জন্য বিভাজক হিসাবে।
ক্লেটন স্ট্যানলি

5

tar এটি আপনার জন্য সত্যিই দ্রুত করবে।

পরীক্ষা

প্রথমে আমি 2 টি ডিরেক্টরি এবং 10 টি ফাইল তৈরি করেছি:

% mkdir test1 test2 ; cd test1
% for n in `seq 1 10` ; do touch ABC.file$n ; done
% ls

> ABC.file1   ABC.file2  ABC.file4  ABC.file6  ABC.file8
> ABC.file10  ABC.file3  ABC.file5  ABC.file7  ABC.file9

তারপরে আমি সেগুলি অনুলিপি করেছিলাম:

% tar -cf - ./* |\ 
    tar -C../test2 --transform='s/ABC/DEF/' -xf -
% ls ../test2

> DEF.file1   DEF.file2  DEF.file4  DEF.file6  DEF.file8
> DEF.file10  DEF.file3  DEF.file5  DEF.file7  DEF.file9

রূপান্তরিত

সুতরাং জিএনইউ ফাইল নামকরণের জন্য tarএকটি গ্রহণ করবে sed --transform=EXPRESSION। এমনকি এটি কেবলমাত্র কয়েকটি ফাইলের নাম পরিবর্তন করতে পারে। এই ক্ষেত্রে:

% tar -cf - ./* |\ 
    tar -C../test2 --transform='s/ABC\(.*[0-5]\)/DEF\1/' -xf -
% ls ../test2

> ABC.file6  ABC.file8  DEF.file1   DEF.file2  DEF.file4
> ABC.file7  ABC.file9  DEF.file10  DEF.file3  DEF.file5

সুতরাং যে এক সুবিধা।

STREAM

এছাড়াও বিবেচনা করুন যে এটি কেবল দুটি tarপ্রক্রিয়া - এবং এটি আপনার ফাইলের গণনা ছাড়াই পরিবর্তিত হবে না।

tar | tar

tarআপনি এটি হতে পারে হিসাবে অপ্টিমাইজড হয়। এটিতে কখনই সমস্যার যুক্তি গণনা বা পলাতক শিশু প্রক্রিয়া থাকবে না। এটি কেবল এ> বি সম্পন্ন হয়েছে।

যুক্তি

আমি tarএখানে আমার দুটি প্রক্রিয়ার মধ্যে মিলিত 7 স্বতন্ত্র আর্গুমেন্ট ব্যবহার করি । এখানে সর্বাধিক গুরুত্বপূর্ণ তালিকাবদ্ধ করা হয়েছে:

-স্টাডাউট / স্টিডিন - এটি জানিয়ে দেয় tarযে এটি এর ইনপুট বা আউটপুটটিতে স্ট্রিমিং করবে বা সেখান থেকে stdin/stdoutএটি কোনও সংরক্ষণাগার তৈরি বা নিষ্কাশন করছে কিনা তার উপর নির্ভর করে সঠিকভাবে ব্যাখ্যা করবে।

-cতৈরি - tarএটি সংরক্ষণাগারটি তৈরি করতে বলে । পরবর্তী যুক্তিটি tarপ্রত্যাশা করে ...

-fফাইল - আমরা নির্দিষ্ট করি যে এটি কোনও টেপ-ডিভাইস বা যা কিছু না করে tarকোনও fileঅবজেক্টের সাথে কাজ করবে । এবং উপরে উল্লিখিত হিসাবে এটি যে ফাইলটির সাথে কাজ করবে এটি হ'ল stdin/stdout- অন্য কথায়, আমাদের |pipe

./*সমস্ত $ পিডাব্লুডি / ফাইল - সংরক্ষণাগার যুক্তিটি প্রথমে আসে, তবে -তারপরে এখানে ব্যাখ্যা করার জন্য খুব বেশি কিছু নয় ./*

... এবং অন্যদিকে |pipe...

-Cডিরেক্টরি পরিবর্তন করুন - এটি জানায় tarযে এটি অন্য যে কোনও ক্রিয়া সম্পাদন করার আগে আমি যে ডিরেক্টরিটিতে উল্লেখ করেছি সেটিতে এটি পরিবর্তন করা দরকার, তাই কার্যকরভাবে এটি cd ../test2নিষ্কাশনের ঠিক আগে।

--transform='s/ed/EXPR/'- যেমন ইতিমধ্যে উল্লিখিত হয়েছে, এটি নতুন নামকরণ করেছিল। তবে ডক্সটি নির্দেশ করে যে এটি কোনও sedঅভিব্যক্তি নিতে পারে বা //flag

-xএক্সট্রাক্ট - tarআমাদের টার্গেট ডিরেক্টরিতে পরিবর্তনের পরে এবং আমাদের পুনর্নামকরণের নির্দেশাবলী পেয়ে যায় আমরা -f - |pipeসংরক্ষণাগার ফাইল থেকে এটির বর্তমান ডিরেক্টরিতে সমস্ত ফাইল বের করা শুরু করার নির্দেশ দিয়েছি । রহস্য নেই।


1
paxএই প্রশ্নের সমাধান এখানে । আমি আমার উত্তরে এটি যুক্ত করব, তবে আমি মনে করি এটি এখানে আরও উপযুক্ত -pax -rws '/^ABC/DEF/' ABC.* .
গ্রেম

@ গ্রামীম - ওহো - এটি আরও ভাল! মনুষ্য, এটি মুক্তার নাম বদলে নরকেও মারধর করে! আপনার এটিকে আপনার উত্তরে রাখা উচিত - paxএটি POSIX নির্দিষ্ট করা আছে - তাই pax
মাইক্রজারভ

paxপসিক্স হতে পারে তবে দুর্ভাগ্যক্রমে এটি খুব কমই ডিফল্টরূপে ইনস্টল করা আছে।
গ্রিম

4

আপনি যদি কোনও কম স্ট্যান্ডার্ড সরঞ্জাম ব্যবহার করতে আপত্তি না করেন তবে আমি মিমিভিভি (ভর পদক্ষেপ) ব্যবহার করার পরামর্শ দিচ্ছি যা এই ধরণের কাজের জন্য লেখা হয়েছিল। mcp(ভর অনুলিপি) ব্যবহার করা যা স্যুটটির অংশ, আপনি কেবল এটি করতে পারেন

mcp "ABC.*" "DEF.#1"

ডাউনলোড প্যাকেজগুলি পাওয়া ঠিক ঠিক সহজ নয়। ঘরে বসে সংকলনের জন্য বর্তমান দেবিয়ান প্যাকেজ (যা আর্চ এওআরও ব্যবহার করে) এখানে পাওয়া যাবে


বাক্সের বাইরে 15.10 উবুন্টুতে ইনস্টল করেapt-get install mmv
থুফির

2

Zsh এ, নিম্নলিখিত লাইনগুলি আপনার .zshrc:

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

তারপরে, কমান্ড লাইনে, আপনি চালাতে পারেন

zcp 'ABC(.*)' 'DEF$1'

বা সহজভাবে

zcp -W ABC.* DEF.*

অন্য শেলটিতে, যতক্ষণ না আপনি zsh ইনস্টল করেছেন:

zsh -c 'autoload zmv; noglob zmv -CW ABC.* DEF.*'

1

আপনি এটি করতে পারেন:

for i in ABC.*; do cp {ABC,DEF}."${i#*.}"; done

সম্ভবত এমন কিছু আছে যা আমি দেখছি না, তবে আমি কীভাবে একাধিক গন্তব্য স্থাপন করছি? আমি প্রতিটি পেতে লুপ ব্যবহার করছি। আমি কোডটি আগেই পরীক্ষা করেছিলাম এবং এটি প্রত্যাশার মতো কাজ করেছে, তাই আমি আপনার ব্যাখ্যাটির প্রশংসা করব।
সারা ফৌজিয়া

এটা আমার খারাপ, আমি আপনার উত্তরটি ভুল করে পড়েছি। :-)
ক্রিস ডাউন

আমি কিভাবে "${i#*.}"বিট পড়া উচিত ?
ডাম্বলডেড

-1

আপনি এটি করতে পারেন: http://www.projectik.eu/index.php/programovanie/linux/item/243-linux-kopirovanie-suborov-vo-vlakne এখানে উদাহরণ


1
ইউনিক্স ও লিনাক্সে স্বাগতম! এই তাত্ত্বিক প্রশ্নের উত্তর হতে পারে, এটা বাঞ্ছনীয় হবে উত্তর অপরিহার্য অংশের এখানে অন্তর্ভুক্ত করা, এবং রেফারেন্স এর জন্য লিঙ্ক প্রদান।
টেরডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.