在bash中将输出作为cp的参数传递

时间:2011-07-26 16:45:42

标签: linux bash unix ls cp

我正在学习unix / linux类,我们还没有学习变量或函数。我们刚刚学习了一些基本的实用程序,如标志和管道,输出和附加到文件。在实验室作业中,他希望我们找到最大的文件并将它们复制到目录中。

我可以获得5个最大的文件,但我不知道如何在一个命令中将它们传递给cp

ls -SF | grep -v / | head -5 | cp ? Directory

4 个答案:

答案 0 :(得分:54)

这将是:

cp `ls -SF | grep -v / | head -5` Directory

假设管道正确。反引号在行中替换其中命令的输出。

您也可以进行测试:

cp `echo a b c` Directory

会将所有abc复制到Directory

答案 1 :(得分:33)

我愿意:

cp $(ls -SF | grep -v / | head -5) Directory
但是,xargs可能是最好的答案。

ls -SF | grep -v / | head -5 | xargs -I{} cp "{}" Directory

答案 2 :(得分:5)

使用像这样的反引号或美元符号$(像这样)来执行命令替换。基本上,这会将反向命令的每行标准输出粘贴到周围的命令中并运行它。在“命令替换”下的bash联机帮助页中了解更多信息。

此外,如果您想一次读取一行,您可以使用“while read”语法读取管道流中的各行:

ls | while read varname; do echo $varname; done

答案 3 :(得分:0)

如果您的cp有一个“-t”标志(请查看手册页),这样可以简化一些事项:

ls -SF | grep -v / | head -5 | xargs cp -t DIRECTORY

find命令为您提供更细粒度的获取所需内容的能力,而不是您拥有的ls | grep。我会像这样编码你的问题:

find . -maxdepth 1 -type f -printf "%p\t%s\n" | 
sort -t $'\t' -k2 -nr | 
head -n 5 | 
cut -f 1 | 
xargs echo cp -t DIRECTORY