Sach
Sach

Reputation: 659

Copying files with specific size to other directory

Its a interview question. Interviewer asked this "basic" shell script question when he understand i don't have experience in shell scripting. Here is question.

Copy files from one directory which has size greater than 500 K to another directory.

I can do it immediately in c lang but seems difficult in shell script as never tried it.I am familiar with unix basic commands so i tried it, but i can just able to extract those file names using below command.

du -sk * | awk  '{ if ($1>500) print $2 }'

Also,Let me know good shell script examples book.

Upvotes: 0

Views: 3123

Answers (3)

James Youngman
James Youngman

Reputation: 3733

find . -mindepth 1 -maxdepth 1 -type f -size +BYTESc -exec cp -t DESTDIR {}\+

The c suffix on the size is essential; the size is in bytes. Otherwise, you get probably-unexpected rounding behaviour in determining the result of the -size check. If the copying is meant to be recursive, you will need to take care of creating any destination directory also.

Upvotes: 0

Alan Curry
Alan Curry

Reputation: 14711

du recurses into subdirectories, which is probably not desired (you could have asked for clarification if that point was ambiguous). More likely you were expected to use ls -l or ls -s to get the sizes.

But what you did works to select some files and print their names, so let's build on it. You have a command that outputs a list of names. You need to put the output of that command into the command line of a cp. If your du|awk outputs this:

Makefile
foo.c
bar.h

you want to run this:

cp Makefile foo.c bar.h otherdirectory

So how you do that is with COMMAND SUBSTITUTION which is written as $(...) like this:

cd firstdirectory
cp $(du -sk * | awk '{ if ($1>500) print $2 }') otherdirectory

And that's a functioning script. The du|awk command runs first, and its output is used to build the cp command. There are a lot of subtle drawbacks that would make it unsuitable for general use, but that's how beginner-level shell scripts usually are.

Upvotes: 3

LSerni
LSerni

Reputation: 57408

It can be done in several ways. I'd try and use find:

find $FIRSTDIRECTORY -size +500k -exec cp "{\} $SECONDDIRECTORY \;

To limit to the current directory, use -maxdepth option.

Upvotes: 4

Related Questions