एक फ़ोल्डर से दूसरे में कई विशिष्ट फ़ाइलों की प्रतिलिपि बनाना


133

मेरे पास चित्रों का एक बड़ा फ़ोल्डर (हजारों) है, और मेरे पास फ़ाइलों की एक लंबी सूची है, सटीक फ़ाइल नाम से, जिसे मुझे दूसरे फ़ोल्डर में कॉपी करने की आवश्यकता है। मैं जानना चाहता हूं कि क्या कोई ऐसा तरीका है जो मैं इस फ़ोल्डर से कई विशिष्ट फ़ाइलों को नाम से चुन सकता हूं, और उन्हें किसी अन्य फ़ोल्डर में कॉपी कर सकता हूं, टर्मिनल का उपयोग कर, उन्हें व्यक्तिगत रूप से कॉपी किए बिना?


विशिष्ट फ़ोल्डर का उपयोग करने के लिए फ़ि, का उपयोग करें: cp -rp /copying/from/{folder1/,folder2/,folder3/} path/to/folderजहां pफ़ोल्डर अनुमति की प्रतिलिपि बनाने के लिए है।
रक्तिम बिस्वास

जवाबों:


179

बस कमांड लाइन से एक बार में कई फाइलों को कॉपी करें

ऐसे कई तरीके हैं जिनसे आप इसे हासिल कर सकते हैं। सबसे आसान मैंने देखा है कि निम्नलिखित का उपयोग करना है।

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

वाक्यविन्यास cp कमांड का उपयोग करके निर्देशिका के लिए पथ द्वारा वांछित फ़ाइलों को उन सभी फ़ाइलों के साथ स्थित करता है, जिन्हें आप कोष्ठक में लिपटे हुए कॉपी करना चाहते हैं और अल्पविराम द्वारा अलग किए जाते हैं।

सुनिश्चित करें कि फ़ाइलों के बीच कोई रिक्त स्थान नहीं हैं। कमांड का अंतिम भाग /home/usr/destination/, वह निर्देशिका है जो आप फ़ाइलों को कॉपी करना चाहते हैं।

या यदि सभी फ़ाइलों में एक ही उपसर्ग है लेकिन अलग-अलग अंत आप इस तरह से कुछ कर सकते हैं:

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

जहां file1, file2, file3 और file4 की नकल की जाएगी।

आपने किस तरह से इस प्रश्न का उत्तर दिया है, मेरा मानना ​​है कि यह वही है जो आप खोज रहे हैं, लेकिन यह भी लगता है कि आप फ़ाइलों की सूची से पढ़ने और एक निश्चित निर्देशिका में उन सभी को कॉपी करने के लिए एक कमांड की तलाश कर रहे हैं। अगर ऐसा है तो मुझे बताएं और मैं अपना जवाब संपादित करूंगा।

अजगर के साथ डुप्लिकेट से निपटना

इसलिए मैंने थोड़ी सी स्क्रिप्ट लिखी कि मेरा मानना ​​है कि काम पूरा करना चाहिए। हालाँकि, मुझे यकीन नहीं है कि आप अजगर में कितने अच्छे हैं (यदि सभी में निपुण हैं) तो मैं यह समझाने की कोशिश करूंगा कि इस स्क्रिप्ट का सबसे अच्छा उपयोग कैसे किया जा सकता है और कृपया इसके बारे में अधिक से अधिक प्रश्न पूछें।

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))

इस स्क्रिप्ट का उपयोग करने के लिए अपेक्षाकृत सरल होना चाहिए। सबसे पहले, उपरोक्त कोड को प्रोग्राम gedit (उबंटू में पूर्व-स्थापित होना चाहिए) या किसी अन्य पाठ संपादक में कॉपी करें।

उसके पूरा होने के बाद, फ़ाइल को अपने होम डायरेक्टरी में मूवमेंटो के रूप में सेव करें (यह कोई भी डायरेक्टरी हो सकती है लेकिन आसानी से इंस्ट्रक्शंस को आसानी से होम डाइरेक्टरी का उपयोग करने देती है) या डायरेक्टरी को उस फाइल में जोड़ें जो आपके पेटीएम में समाहित है। फिर cdटर्मिनल से अपने होम डायरेक्टरी (या जो भी डायरेक्टरी आपने मूवमेंट को सेव किया है) और निम्न कमांड टाइप करें:

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

यह उन सभी फ़ाइलों को कॉपी करना चाहिए जिन्हें स्रोत निर्देशिका से गंतव्य निर्देशिका में सूचीबद्ध किया गया है, प्रारूप पिक (1) .jpg, pic (2) .jpg और इसी तरह के डुप्लिकेट के साथ। file.txt एक ऐसी फाइल होनी चाहिए जो उन सभी चित्रों को सूचीबद्ध करे जिन्हें आप प्रत्येक प्रविष्टि के साथ अपनी अलग लाइन पर कॉपी करना चाहते हैं।

किसी भी तरह से इस स्क्रिप्ट को स्रोत निर्देशिका को प्रभावित नहीं करना चाहिए, हालांकि स्रोत और गंतव्य निर्देशिका में सही पथ दर्ज करना सुनिश्चित करें और सबसे खराब यह हो सकता है कि आप फ़ाइलों को गलत निर्देशिका में कॉपी करें।

टिप्पणियाँ

  • यह स्क्रिप्ट मानती है कि सभी मूल चित्र एक ही डायरेक्टरी में हैं। यदि आप इसे उप निर्देशिकाओं की जाँच करना चाहते हैं तो स्क्रिप्ट को संशोधित करना होगा।
  • यदि आप गलती से किसी फ़ाइल का नाम गलत करते हैं, तो स्क्रिप्ट
    "फ़ाइल मौजूद नहीं है" त्रुटि को थूक देगी और आपको जारी रखने के लिए "प्रेस दर्ज" करने के लिए संकेत देगी और स्क्रिप्ट बाकी सूची की प्रतिलिपि जारी रखेगी।
  • /स्रोत
    निर्देशिका और गंतव्य निर्देशिका के पथ के लिए दोनों पथ पर अनुगामी मत भूलना । अन्यथा स्क्रिप्ट आप पर एक त्रुटि थूक देगी।

धन्यवाद, मेरी समस्या का अधिकांश हल हो गया, हालांकि, कुछ फाइलें दो या अधिक बार सूची में दिखाई देती हैं, मैं इन डुप्लिकेट को ऑटो-नाम कैसे दे सकता हूं? (हां, मैं जो कर रहा हूं उसके लिए मुझे डुप्लिकेट की आवश्यकता है।)
किसी के पास बहुत अधिक चित्र

क्या विभिन्न उप फ़ोल्डरों से डुप्लिकेट हैं या फ़ाइल.जेपीजी और फ़ाइल (1) .jpg जैसे कुछ लेबल हैं? अन्यथा मुझे यकीन नहीं है कि आपके पास ऐसी फाइलें हैं जो समान हैं। कुछ हद तक आपके प्रश्न का उत्तर देने के लिए, मुझे विश्वास नहीं है कि आप लाइनर पर एक सरल खोजने में सक्षम होने जा रहे हैं जो आपके लिए डुप्लिकेट का नाम बदल देगा। मुझे लगता है कि उस प्रकार की कार्यक्षमता को पाने के लिए एक बैश या किसी अन्य प्रकार की पटकथा लिखनी होगी। हालाँकि, मैंने कुछ बहुत ही हास्यास्पद एक लाइन कमांड देखे हैं, ताकि हो सकता है कि कुछ लिनक्स विजार्ड दिखा सकें और उत्तर प्रदान कर सकें।
ब्रायन

मेरे पास मूल रूप से प्रत्येक फ़ाइल में से एक है, हालाँकि फ़ाइलों का नाम सूची में दो बार या अधिक है। अधिक या कम मुझे इसके लिए क्या करना चाहिए, जब नए फ़ोल्डर में एक फ़ाइल रखने की कोशिश की जा रही है, और उस नाम से एक फ़ाइल पहले से ही समाप्त हो गई है, मुझे इसके लिए एक (2) या फ़ाइल नाम के अंत में जोड़ने की आवश्यकता है और इसे जगह दें।
कोई व्यक्ति बहुत से चित्र

मैं सिर्फ कॉपी करने के लिए फ़ाइलों की सूची में कोई स्थान नहीं होने के बारे में जोर देने का सुझाव देना चाहता हूं। यदि कोई रिक्त स्थान हैं, तो भी फ़ाइलों के बीच {foo, bar, ..} कमांड काम नहीं करेगा।
फ़्रैंकैंड्स

आगे के शॉर्टकट खोजने वालों के लिए, आप फाइलों के निरपेक्ष पथ के लिए खड़े होने के लिए कमांड प्रतिस्थापन का उपयोग कर सकते हैं, अर्थात cp $(pwd)/{file1,file2} /path/to/dst/या cp $(pwd)/{file1,file2} $(pwd)/{renamed1,renamed2}, आदि
baelx

49

शायद मुझे आपके सवाल का एक विवरण याद आ रहा है, लेकिन दिए गए उत्तर अत्यधिक लगते हैं। यदि आप कमांड लाइन समाधान चाहते हैं और स्क्रिप्ट नहीं, तो क्यों:

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

इस तरह से करने के बारे में अच्छी बात यह है कि आप फ़ाइल नामों को पूरा कर सकते हैं


4
यह macOS सिएरा में एक "गैरकानूनी विकल्प --t"
लौटाता है

महान जवाब, बहुत आसान है। @geoyws शायद यह POSIX या GNU चीज़ है जो Apple के संस्करण में नहीं है। यह मेरे लिए डेबियन लिनक्स या MSYS2 के साथ विंडोज पर ठीक काम करता है।
अंडरस्कोर_ड

अच्छा सुझाव! आर्च लाइन में काम किया।
एडू रुइज

brew install coreutilsतब आप gउपसर्ग के साथ सामान्य रूप से गन्नो सामान प्राप्त कर सकते हैं । तो वह होगाgcp -t ....
T.Chmelevskij

मैक ओएस बीएसडी संस्करण का उपयोग करता है cp, और विशेष रूप से न तो ओपनबीएसडी और न ही फ्रीबीएसडी में वह विकल्प है, इसलिए हां - यह जीएनयू cp विशिष्ट है। यह भी POSIX मानक द्वारा निर्दिष्ट नहीं है । चूंकि यह उबंटू विशिष्ट साइट है, यह स्वीकार्य है, लेकिन ओएस के बीच लिपियों को पोर्ट करने के लिए पॉसिक्स मानक से चिपके रहना बेहतर है
सर्गी कोलोडियाज़नी

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.