Anand
Anand

Reputation: 363

How do I copy multiple files at once in linux? With the source and the destination locations of these files being the same directory

I have some files located in one directory /home/john I want to copy all the files with *.text extension from this directory and save them as *.text.bkup, again in the same directory, i.e. /home/john

Is there a single command with which I can do that? Also, with extension of the same idea, is it possible to copy all the files with multiple extentions (e.g. *.text & *.doc) as *.text.bkup & *.doc.bkup repectively (again in the same directory)?

Upvotes: 2

Views: 7455

Answers (4)

vim
vim

Reputation: 84

I sort of use a roundabout way to achieve this. It involves a Perl script and needs additional steps.

Step 1: Copy the names of all the text files into a text file.

find -maxdepth 1 -type f -name '*.txt' > file_name1.txt

Step 2: Make a duplicate of the copied file.

cp file_name1.txt file_name2.txt

Now open the file_name2.txt in vi editor and do a simple string substitution.

%s/.text/.text.backup/g

Step 3: Merge the source and destination file names into a single file separated by a comma.

paste -d, file_name1.txt file_name2.txt > file_name.txt

Step 4: Run the below perl script to achieve the desired results

open(FILE1,"<file_name.txt") or die'file doesnt exist'; #opens a file that has source and destination separated beforhand using commas
chomp(@F1_CONTENTS=(<FILE1>)); # copies the content of the file into an array
close FILE1;
while()
{
    foreach $f1 (@F1_CONTENTS) 
    {
    @file_name=split(/,/,$f1);  # separates the file content based on commas
        print "cp $file_name[0] $file_name[1]\n";
    system ("cp $file_name[0] $file_name[1]"); # performs the actual copy here
    }
last;
}

Upvotes: 0

Pedro Gonzalez
Pedro Gonzalez

Reputation: 180

You can achieve this easily with find:

find /home/john -iname '*.text' -type f -exec cp \{} \{}.backup \;

Upvotes: 2

deimus
deimus

Reputation: 9865

No, there is no single/simple command to achieve this with standard tools

But you can write a script like this to do it for you.

for file in *.text
do
    cp -i "${file}" "${file}.bkup"
done

with -i option you can confirm each overwriting operation

Upvotes: 0

Luke Bigum
Luke Bigum

Reputation: 110

This is best accomplished with a Shell loop:

~/tmp$ touch one.text two.text three.doc four.doc  
~/tmp$ for FILE in *.text *.doc; do cp ${FILE} ${FILE}.bkup; done 
~/tmp$ ls -1
four.doc
four.doc.bkup
one.text
one.text.bkup
three.doc
three.doc.bkup
two.text
two.text.bkup

What happens in the code above is the shell gets all .text and .doc files and then loops through each value one by one, assigning the variable FILE to each value. The code block between the "do" and the "done" is executed for every value of FILE, effectively copying each file to filename.bkup.

Upvotes: 3

Related Questions