47

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

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

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

4 回答 4

79

这将是:

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

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

您还可以进行测试:

cp `echo a b c` Directory

a将所有,b和复制cDirectory.

于 2011-07-26T16:49:27.023 回答
51

我会做:

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

xargs 可能是最好的答案。

ls -SF | grep -v / | head -5 | xargs -I{} cp "{}" Directory
于 2011-07-26T16:54:16.083 回答
7

使用反引号 `like this` 或美元符号 $(like this) 来执行命令替换。基本上,这会将反引号命令的每一行标准输出粘贴到周围的命令中并运行它。在“命令替换”下的 bash 手册页中查找更多信息。

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

ls | while read varname; do echo $varname; done
于 2011-07-26T16:57:10.153 回答
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
于 2011-07-26T17:15:19.980 回答