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

我正在学习一个unix / linux类,我们还没有学习variables或函数。 我们刚刚学习了一些基本的工具,如标志和pipe道,输出和附加到文件。 在实验室任务上,他希望我们find最大的文件并将其复制到一个目录中。

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

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

Solutions Collecting From Web of "传递输出作为cp在bash中的参数"

这将是:

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

假设管道是正确的。 反引号代替行内命令的输出。

你也可以做你的测试:

 cp `echo abc` Directory 

将所有abc复制到Directory

我会做:

 cp $(ls -SF | grep -v / | head -5) Directory 

xargs虽然可能是最好的答案。

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

使用反斜杠`像这样`或美元符号$(像这样)来执行命令替换。 基本上这将反向命令的标准输出的每一行粘贴到周围的命令并运行它。 在“命令替换”下的bash manpage中找到更多信息。

另外,如果您想一次读取一行,则可以使用“while read”语法从管道流中读取单个行:

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

如果你的cp有一个“-t”标志(检查手册页),这简化了一些事情:

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

find命令让你获得更多的细节能力,而不是ls | grep 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