একাধিক নির্দিষ্ট ফাইল এক ফোল্ডার থেকে অন্য ফোল্ডারে অনুলিপি করা হচ্ছে


133

আমার কাছে ছবিগুলির বড় ফোল্ডার রয়েছে (হাজার হাজার), এবং আমার কাছে ফাইলের দীর্ঘ তালিকা রয়েছে, সঠিক ফাইলের নাম অনুসারে, আমাকে অন্য ফোল্ডারে অনুলিপি করতে হবে। আমি জানতে চাই যে এই ফোল্ডারটি থেকে নাম অনুসারে কয়েকটি নির্দিষ্ট ফাইল নির্বাচন করতে পারি এবং স্বতন্ত্রভাবে অনুলিপি না করে টার্মিনালটি ব্যবহার করে এটিকে অন্য ফোল্ডারে অনুলিপি করতে পারি?


Fyi, নির্দিষ্ট ফোল্ডারগুলি অনুলিপি করার জন্য ব্যবহার করুন:, ফোল্ডারের অনুমতি অনুলিপি করার জন্য cp -rp /copying/from/{folder1/,folder2/,folder3/} path/to/folderকোথায় p
রক্তিম বিশ্বাস

উত্তর:


178

কমান্ড লাইন থেকে একবারে একাধিক ফাইল অনুলিপি করুন

আপনি এটি অর্জন করতে পারেন এমন অনেকগুলি উপায় রয়েছে। আমি দেখেছি সবচেয়ে সহজ হল নিম্নলিখিতটি ব্যবহার করা।

cp /home/usr/dir/{file1,file2,file3,file4} /home/usr/destination/

সিনট্যাক্সটি সিপি কমান্ডটি ব্যবহার করে সেই ডিরেক্টরিতে যাওয়ার পথটি অনুসরণ করবে যা আপনার বন্ধনীতে মোড়ানো এবং কমা দ্বারা বিচ্ছিন্ন করতে চান এমন সমস্ত ফাইলের সাথে কাঙ্ক্ষিত ফাইলগুলি অবস্থিত।

নিশ্চিত করুন যে ফাইলগুলির মধ্যে কোনও ফাঁকা স্থান নেই। কমান্ডের শেষ অংশটি /home/usr/destination/হ'ল ডিরেক্টরিটি যা আপনি ফাইলগুলি অনুলিপি করতে চান তা।

বা যদি সমস্ত ফাইলের উপসর্গ একই থাকে তবে ভিন্ন প্রান্ত থাকে তবে আপনি এরকম কিছু করতে পারেন:

cp /home/usr/dir/file{1..4} ./

যেখানে ফাইল 1, ফাইল 2, ফাইল 3 এবং ফাইল 4 অনুলিপি করা হবে।

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

অজগর দিয়ে নকল নিয়ে কাজ করছে with

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

import os,sys,shutil
### copies a list of files from source. handles duplicates.
def rename(file_name, dst, num=1):
    #splits file name to add number distinction
    (file_prefix, exstension) = os.path.splitext(file_name)
    renamed = "%s(%d)%s" % (file_prefix,num,exstension)

    #checks if renamed file exists. Renames file if it does exist.
    if os.path.exists(dst + renamed):
        return rename(file_name, dst, num + 1)
    else:
        return renamed

def copy_files(src,dst,file_list):
    for files in file_list:
        src_file_path = src + files
        dst_file_path = dst + files
        if os.path.exists(dst_file_path):
            new_file_name =  rename(files, dst)
            dst_file_path = dst + new_file_name

        print "Copying: " + dst_file_path
        try:
            shutil.copyfile(src_file_path,dst_file_path)
        except IOError:
            print src_file_path + " does not exist"
            raw_input("Please, press enter to continue.")

def read_file(file_name):
    f = open(file_name)
    #reads each line of file (f), strips out extra whitespace and 
    #returns list with each line of the file being an element of the list
    content = [x.strip() for x in f.readlines()]
    f.close()
    return content

src = sys.argv[1]
dst = sys.argv[2]
file_with_list = sys.argv[3]

copy_files(src,dst,read_file(file_with_list))

এই স্ক্রিপ্টটি ব্যবহার করা তুলনামূলকভাবে সহজ হওয়া উচিত। প্রথমে উপরের কোডটি প্রোগ্রামের জিডিতে (উবুন্টুতে প্রাক ইনস্টল থাকা উচিত) বা অন্য কোনও পাঠ্য সম্পাদকে অনুলিপি করুন।

এটি সম্পূর্ণ হওয়ার পরে ফাইলটিকে আপনার হোম ডিরেক্টরিতে মুভ.পি হিসাবে সংরক্ষণ করুন (এটি কোনও ডিরেক্টরি হতে পারে তবে নির্দেশের স্বাচ্ছন্দ্যের জন্য কেবলমাত্র হোম ডিরেক্টরি ব্যবহার করতে দেয়) বা ফাইলটি আপনার প্যাথের মধ্যে থাকা ডিরেক্টরিটি যুক্ত করুন। তারপরে cdটার্মিনাল থেকে আপনার হোম ডিরেক্টরিতে (বা যে কোনও ডিরেক্টরি আপনি মুভ.পাই-তে সংরক্ষণ করেছেন) এ লিখে নিম্নলিখিত কমান্ডটি টাইপ করুন:

python move.py /path/to/src/ /path/to/dst/ file.txt

এটি উত্স ডিরেক্টরি থেকে গন্তব্য ডিরেক্টরিতে তালিকাভুক্ত সমস্ত ফাইলের অনুলিপি পিক (1) .jpg, pic (2) .jpg এবং এই জাতীয় ফর্ম্যাট গ্রহণ করে অনুলিপি করা উচিত। file.txt এমন একটি ফাইল হওয়া উচিত যা আপনার নিজের পৃথক লাইনে প্রতিটি এন্ট্রি সহ অনুলিপি করতে চান এমন সমস্ত চিত্রের তালিকা করে।

এই স্ক্রিপ্টটি উত্স ডিরেক্টরিটিকে কোনওভাবেই প্রভাবিত করা উচিত নয়, তবে কেবল উত্স এবং গন্তব্য ডিরেক্টরিতে সঠিক পাথগুলি প্রবেশ করানো নিশ্চিত করে নিন এবং সবচেয়ে খারাপটি ঘটতে পারে আপনি হ'ল ফাইলগুলি ভুল ডিরেক্টরিতে অনুলিপি করছেন।

নোট

  • এই স্ক্রিপ্টটি ধরে নিয়েছে যে সমস্ত আসল চিত্র একই ডিরেক্টরিতে রয়েছে। আপনি যদি এটি সাব ডিরেক্টরিগুলিও পরীক্ষা করতে চান তবে স্ক্রিপ্টটি পরিবর্তন করা দরকার।
  • আপনি যদি দুর্ঘটনাক্রমে কোনও ফাইলের নাম ভুল টাইপ করেন তবে স্ক্রিপ্টটি
    "ফাইলটির অস্তিত্ব নেই" ত্রুটিটি ছুঁড়ে দেয় এবং আপনাকে "এন্টার টিপুন" চালিয়ে যাওয়ার অনুরোধ জানায় এবং স্ক্রিপ্টটি বাকী তালিকার অনুলিপিটি চালিয়ে যেতে থাকবে।
  • /উত্স
    ডিরেক্টরি এবং গন্তব্য ডিরেক্টরিতে পাথ উভয় পথ অনুসরণ করবেন না । অন্যথায় স্ক্রিপ্টটি আপনাকে আবার ত্রুটি করবে।

আপনাকে ধন্যবাদ, যা আমার বেশিরভাগ সমস্যার সমাধান করেছে, তবে কিছু ফাইল তালিকায় দু'বার বা আরও বেশি উপস্থিত হয়, আমি কীভাবে এগুলি এই সদৃশগুলিকে পুনরায় নামকরণ করতে পারি? (হ্যাঁ, আমি যা করছি তার জন্য আমার ডুপ্লিকেটগুলি দরকার))
অনেক বেশি ছবি সহ কেউ

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

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

আমি কেবল অনুলিপি করতে ফাইলের তালিকায় কোনও ফাঁকা স্থান না থাকার বিষয়ে জোর দেওয়ার পরামর্শ দিতে চাই। যদি কোনও ফাঁকা স্থান থাকে, এমনকি {ফু, বার, .. files ফাইলের মধ্যেও কমান্ডটি কাজ করবে না।
ফ্রাঙ্কস্যান্ডস

যারা আরও শর্টকাট সন্ধান করছে তাদের জন্য, আপনি ফাইলের নিরঙ্কুশ পথের জন্য দাঁড়ানোর জন্য কমান্ড প্রতিস্থাপনের ব্যবহার করতে পারেন, cp $(pwd)/{file1,file2} /path/to/dst/বা cp $(pwd)/{file1,file2} $(pwd)/{renamed1,renamed2}, ইত্যাদি
বাএলেক্স

49

সম্ভবত আমি আপনার প্রশ্নের একটি বিবরণ মিস করছি, তবে প্রদত্ত উত্তরগুলি অত্যধিক বলে মনে হচ্ছে। যদি আপনি কোনও কমান্ড লাইন সমাধান চান এবং না স্ক্রিপ্ট, তবে কেন নয়:

cd /path/to/src/
cp -t /path/to/dst/ file1 file2 file3 ...

এইভাবে এটি করার দুর্দান্ত জিনিসটি হ'ল আপনি ফাইলের নামগুলি সম্পূর্ণ ট্যাব করতে পারেন


4
এটি ম্যাকস সিয়েরায় একটি "অবৈধ বিকল্প - ট" প্রদান করে
জিওউইউজ

দুর্দান্ত উত্তর, অনেক সহজ। @ জাইউইউজ সম্ভবত এটি পসিক্স বা জিএনইউ জিনিস যা অ্যাপলের সংস্করণে নেই। এটি আমার জন্য দেবিয়ান লিনাক্স বা এমএসওয়াইএস 2 সহ উইন্ডোতে দুর্দান্ত কাজ করে।
আন্ডারস্কোর_২২

সুন্দর পরামর্শ! আর্চ লিনাক্সে কাজ করেছেন।
এডু রুইজ

brew install coreutilsতারপরে আপনি gউপসর্গ সহ সাধারণ gnu জিনিসগুলি পেতে পারেন । সুতরাং এটি হবেgcp -t ....
T.Chmelevskij

ম্যাক ওএস বিএসডি সংস্করণ ব্যবহার করে cpএবং বিশেষত ওপেনবিএসডি বা ফ্রিবিএসডি-র কোনওটিরই বিকল্প নেই, তাই হ্যাঁ - এটি জিএনইউ cp নির্দিষ্ট। এটি পসিক্স স্ট্যান্ডার্ড দ্বারা নির্দিষ্ট করা হয়নি । যেহেতু এটি উবুন্টু নির্দিষ্ট সাইট, এটি গ্রহণযোগ্য, তবে ওএসের মধ্যে স্ক্রিপ্টগুলি পোর্ট করার জন্য পসিক্স স্ট্যান্ডার্ডের সাথে
লেগে থাকা

7

এখানে একটি খাঁটি বাশ সমাধান। এটি একটি ইনপুট ফাইল (প্রতি লাইনে একটি) থেকে ফাইলের নামগুলি পড়বে এবং সেগুলির প্রত্যেকটিকে অনুলিপি করে পুনরায় নামকরণ করবে।

#!/usr/bin/env bash

## The destination folder where your files will
## be copied to.
dest="bar";

## For each file path in your input file
while read path; do 
    ## $target is the name of the file, removing the path. 
    ## For example, given /foo/bar.txt, the $target will be bar.txt.
    target=$(basename "$path"); 
    ## Counter for duplicate files
    c=""; 
    ## Since $c is empty, this will check if the
    ## file exists in target.
    while [[ -e "$dest"/"$target"$c ]]; do
        echo "$target exists"; 
        ## If the target exists, add 1 to the value of $c
        ## and check if a file called $target$c (for example, bar.txt1)
        ## exists. This loop will continue until $c has a value
        ## such that there is no file called $target$c in the directory.
        let c++; 
        target="$target"$c; 
    done; 
    ## We now have everything we need, so lets copy.
    cp "$path" "$dest"/"$target"; 
done

এই স্ক্রিপ্টটি আপনার একটি ফোল্ডারে সংরক্ষণ করুন $PATHএবং এটিকে ইনপুট হিসাবে পাথের তালিকার সাথে কল করুন:

auto_copy.sh < file_paths.txt

আপনি টার্মিনাল থেকে কমান্ড হিসাবে পুরো জিনিসটি চালাতে পারেন:

while read path; do 
   target=$(basename "$path"); 
   c=""; 
   while [[ -e bar/"$target"$c ]]; do 
    echo "$target exists"; 
    let c++; 
    target="$target"$c; 
   done; 
   cp "$file" bar/"$target"; 
done < file_names;

1

প্রশ্নের বিবরণ অনুসারে, আমার বোঝাপড়াটি হ'ল:

  • ফাইলগুলির একটি তালিকা রয়েছে, সম্ভবত একটি টেক্সট ফাইল input.txt
  • তালিকায় কেবল ফাইলের নাম রয়েছে
  • একটি নির্দিষ্ট ডিরেক্টরি আছে যেখানে এই ফাইলের নামগুলি অবস্থিত।

সুতরাং, নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

xargs -I % --arg-file=input.txt cp  /path/to/origin_dir/%  /path/to/destination

ব্যাখ্যা:

  • -I % কমান্ডের মধ্যে ব্যবহৃত প্রক্রিয়াজাত ফাইলের জন্য প্রতীক নির্দিষ্ট করে
  • --arg-file=input.txt আদেশ থেকে আর্গুমেন্ট নিতে নির্দিষ্ট করে input.txt
  • cp /path/to/origin_dir/% /path/to/destination/বর্তমানে প্রক্রিয়া করা ফাইলটির নাম এবং নাম প্রতিস্থাপনের সাথে cpকমান্ড সম্পাদন করবে ।/path/to/origin_dir/%/path/to/origin_dir/

ব্যবহারিক উদাহরণ:

$ cat input.txt
file2.txt
file1.txt
file3.txt
$ ls ./docs
file1.txt  file2.txt  file3.txt
$ xargs -I % --arg-file=input.txt cp ./docs/% ./docs_destination/
$ ls ./docs_destination/
file1.txt  file2.txt  file3.txt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.