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

Linux 在bash中将输出作为cp的参数传递,linux,bash,unix,ls,cp,Linux,Bash,Unix,Ls,Cp,我正在上unix/linux课程,我们还没有学习变量或函数。我们刚刚学习了一些基本实用程序,如标志和管道、输出和附加到文件。在实验室任务中,他希望我们找到最大的文件,并将它们复制到一个目录中 我可以得到5个最大的文件,但我不知道如何通过一个命令将它们传递到cp ls -SF | grep -v / | head -5 | cp ? Directory 它将是: cp `ls -SF | grep -v / | head -5` Directory 假设管道是正确的。反勾号在该行中替代其内部命

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

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

ls -SF | grep -v / | head -5 | cp ? Directory
它将是:

cp `ls -SF | grep -v / | head -5` Directory
假设管道是正确的。反勾号在该行中替代其内部命令的输出

您还可以进行以下测试:

cp `echo a b c` Directory
将所有
a
b
、和
c
复制到
目录中

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

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

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

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


如果您的
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

man xargs
是你的朋友…另请参见。这正是我需要将窗口ID列表(从
xwininfo
的输出中删除)导入
xdool
的原因,这样我就可以关闭弹出的一组错误对话框。这个语法适用于zsh:)我检查了我的系统(macOS 10.12.1)上的手册页,但-t选项似乎不存在:
~$cp-t main.c main2.c cp:非法选项--t
我认为-t是GNU选项,Mac不是GNU。虽然这可能有效,但请注意您是对的。然而,很难按大小顺序列出文件,而且
ls-SF
也很容易。事实上,如果文件中有空格,这种解决方案是不正确的。非常有用。请解释各种选项及其逻辑。
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