সিপি ব্যবহার করে একাধিক ডিরেক্টরিতে একক ফাইল অনুলিপি করা


12

এই প্রশ্নটি আমার আগের প্রশ্নের ধরণের সিক্যুয়াল, ব্যবহার করে অসংখ্য ডিরেক্টরি তৈরি করাmkdir

আমি bashশেলটি ব্যবহার করছি আমি পঞ্চাশটি ডিরেক্টরি তৈরি করেছি, প্রত্যেকটি কমান্ডটি ব্যবহার করে উপসর্গ "s" দিয়ে শুরু করব:

mkdir $(printf "s%02i " $(seq 1 50))

শূন্যের সাথে দ্বিতীয় অঙ্কে প্যাডগুলি। অর্থাৎ ডিরেক্টরি আমি প্রাপ্ত ফর্ম হয় s01, s02, ..., , ।s49s50

এখন আমি পঞ্চাশটি ডিরেক্টরিতে প্রতিটিতে cpএকটি ফাইল (উদাহরণস্বরূপ test.txt) অনুলিপি করতে ব্যবহার করতে চাই । এটি কি উপরের উপমা অনুসারে কোনও উপায়ে করা সম্ভব? উদাহরণস্বরূপ, নিম্নলিখিত কাজ করবে? আমি ইউনিক্স / লিনাক্সে তুলনামূলকভাবে নতুন, সুতরাং কেউ দয়া করে আমাকে নিরাপদ রাখার ইঙ্গিত না দিলে আমি সত্যিই এটি চেষ্টা করতে চাই না।

cp test.txt $ (printf "s% 02i.txt" $ (seq 1 50))

manপৃষ্ঠাটি দেখার জন্য cp, দেখে মনে হচ্ছে এটি এর মতো cpএকাধিক গন্তব্যগুলিকে সমর্থন করে না :

NAME
       cp - copy files and directories

SYNOPSIS
       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...

DESCRIPTION
       Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

       Mandatory  arguments  to  long  options are mandatory for short options
       too.

উত্তর:


7

আপনি যদি প্রতিটি কমান্ড থেকে আউটপুটটি প্রতিটি ডিরেক্টরিতে ফাইলটি অনুলিপি করতে ব্যবহার করতে চান তবে আপনি cpসর্বদা এটিতে পাইপ করতে পারেন xargs:

printf "s%02i " $(seq 1 50) | xargs -n 1 cp test.txt

আউটপুট পার্সিংয়ের সুরক্ষা নিয়ে কোনও উদ্বেগ থাকা উচিত নয় যেহেতু আপনি হাতের আগে এর ফর্ম্যাট এবং বিষয়বস্তু জানেন - ফাইলের নামগুলিতে মেটা অক্ষর এবং স্পেসের মুখোমুখি হওয়ার ঝুঁকিটি এখানে আসলেই সমস্যা নয়।

বিকল্পভাবে, ডিরেক্টরিগুলি ইতিমধ্যে বিদ্যমান রয়েছে ধরে নিয়ে আপনি এই জাতীয় কিছু চেষ্টা করতে পারেন:

find . -maxdepth 1 -type d -name 's[0-9][0-9]' -print0 | xargs -0 -I {} cp test.txt {}

বা পাইপ ছাড়াই:

find . -maxdepth 1 -type d -name 's[0-9][0-9]' -exec cp test.txt {} \;

শেষ দুটি কমান্ড বর্তমান ডিরেক্টরিতে এবং সেগুলিতে যে কোনও ফাইল সন্ধান cp test.txtকরবে। -maxdepth 1বিকল্প হিসাবে ভাল ফাইল গ্রহণ কোনো সাব ডিরেক্টরি এড়াতে হবে। সতর্কতা অবলম্বন করুন যে কোনও দুটি অঙ্কের সাথে 's[0-9][0-9]'মিলে যাচ্ছে s, যার অর্থ যদি কোনও কারণে আপনার কাছে s99থাকে তবে cwdএটির একটি অনুলিপিও পাবেন test.txt


8

আপনি শেলটি একটি forলুপ দিয়ে পুনরাবৃত্তি করতে দিতে পারেন । এটি সর্বাধিক প্রাথমিক উপায় যা বাহ্যিক সরঞ্জামগুলিতে parallelবা এর মতো নির্ভর করে না xargsএবং আমি এটি বোঝা সহজ বলে মনে করি:

for name in $(printf "s%02i " $(seq 1 50)); do
    mkdir $name
    cp test.txt $name
done

এটি লেখার জন্য আরও এক মিলিয়ন উপায় রয়েছে, যেমন:

for name in $(seq -w 1 50); do
    mkdir s$name
    cp test.txt s$name
done

আপনি যদি এটি যাচাই করার আগে যা কার্যকর করা হয় তা যাচাই করতে চান, আপনি কমান্ডগুলি প্রেন্ডিংয়ের মতো কিছু করতে পারেন echoযা এটি কার্যকর করার পরিবর্তে লাইনটি মুদ্রণ করবে:

for name in $(seq -w 1 50); do
    echo mkdir s$name
    echo cp test.txt s$name
done

আউটপুট:

mkdir s01
cp test.txt s01
mkdir s02
cp test.txt s02
mkdir s03
cp test.txt s03
# etc.

4

এটি অনুসারে: /programming/195655/how-to-copy-a-file-to-m Multiple-directories- using-t--gnu-cp-command এ একটি ফাইল অনুলিপি করা সম্ভব নয় বিভিন্ন গন্তব্য. লিঙ্কটি পরীক্ষা করুন, কারণ এটি এটি করার জন্য অন্য কোনও উপায় দেখায়।


2

আপনি জিএনইউ সমান্তরালও ব্যবহার করতে পারেন । ধরে নিই যে আপনার পাঠ্য.টি.এস.টি. ডিরেক্টরি রয়েছে এবং আপনার 50 টি ডায়ারগুলি /my/50dirs/path(যেমন /my/50dirs/path/s01, /my/50dirs/path/s02ইত্যাদি) আপনি চালাতে চান সেখানে অবস্থিত :

seq -w 01 50 | parallel -j1 cp text.txt /my/50dirs/path/s{}

2
এটি আরও ভাল করে নিন parallel -j1, অন্যথায় কোর প্রতি এক জব থাকবে এবং একটি মাল্টিকোর মেশিনে আইও প্রতিযোগিতা করবে।
গিলস 23'9
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.