我正在学习unix / linux类,我们还没有学习变量或函数。我们刚刚学习了一些基本的实用程序,如标志和管道,输出和附加到文件。在实验室作业中,他希望我们找到最大的文件并将它们复制到目录中。
我可以获得5个最大的文件,但我不知道如何在一个命令中将它们传递给cp
ls -SF | grep -v / | head -5 | cp ? Directory
答案 0 :(得分:54)
这将是:
cp `ls -SF | grep -v / | head -5` Directory
假设管道正确。反引号在行中替换其中命令的输出。
您也可以进行测试:
cp `echo a b c` Directory
会将所有a
,b
和c
复制到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