murtaza52
murtaza52

Reputation: 47431

how to pipe commands in ubuntu

How do I pipe commands and their results in Ubuntu when writing them in the terminal. I would write the following commands in sequence -

$ ls | grep ab
abc.pdf
cde.pdf
$ cp abc.pdf cde.pdf files/

I would like to pipe the results of the first command into the second command, and write them all in the same line. How do I do that ?

something like

$ cp "ls | grep ab" files/

(the above is a contrived example and can be written as cp *.pdf files/)

Upvotes: 1

Views: 14186

Answers (3)

glenn jackman
glenn jackman

Reputation: 246799

To use xargs, you need to ensure that the filename arguments are the last arguments passed to the cp command. You can accomplish this with the -t option to cp to specify the target directory:

ls | grep ab | xargs cp -t files/

Of course, even though this is a contrived example, you should not parse the output of ls.

Upvotes: 4

Seth Robertson
Seth Robertson

Reputation: 31451

Well, since the xargs person gave up, I'll offer my xargs solution:

ls | grep ab | xargs echo | while read f; do cp $f files/; done

Of course, this solution suffers from an obvious flaw: files with spaces in them will cause chaos.

An xargs solution without this flaw? Hmm...

ls | grep ab | xargs '-d\n' bash -c 'docp() { cp "$@" files/; }; docp "$@"'

Seems a bit klunky, but it works. Unless you have files with returns in them I mean. However, anyone who does that deserves what they get. Even that is solvable:

find . -mindepth 1 -maxdepth 1 -name '*ab*' -print0 | xargs -0 bash -c 'docp() { cp "$@" files/; }; docp "$@"'

Upvotes: 6

user529758
user529758

Reputation:

Use the following:

cp `ls | grep ab` files/

Upvotes: 6

Related Questions