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

Yam*_*iko 34 unix linux bash ls cp

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

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

ls -SF | grep -v / | head -5 | cp ? Directory
Run Code Online (Sandbox Code Playgroud)

Die*_*lla 60

这将是:

cp `ls -SF | grep -v / | head -5` Directory
Run Code Online (Sandbox Code Playgroud)

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

您也可以进行测试:

cp `echo a b c` Directory
Run Code Online (Sandbox Code Playgroud)

将全部复制a,bcDirectory.

  • 虽然这可能有效,但请注意 [为什么你不应该解析 ls(1) 的输出](https://mywiki.wooledge.org/ParsingLs) (2认同)

gpo*_*ojd 36

我会做:

cp $(ls -SF | grep -v / | head -5) Directory
Run Code Online (Sandbox Code Playgroud)

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

ls -SF | grep -v / | head -5 | xargs -I{} cp "{}" Directory
Run Code Online (Sandbox Code Playgroud)

  • 非常有用。很高兴解释各种选项及其逻辑。 (3认同)

Bri*_*don 6

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

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

ls | while read varname; do echo $varname; done
Run Code Online (Sandbox Code Playgroud)