【问题标题】:pass output as an argument for cp in bash [duplicate]在bash中将输出作为参数传递给cp [重复]
【发布时间】:2011-10-13 14:21:16
【问题描述】:

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

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

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

【问题讨论】:

标签: linux bash unix ls cp


【解决方案1】:

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

【讨论】:

  • 我检查了系统(macOS 10.12.1)上的手册页,但 -t 选项似乎不存在:~$ cp -t main.c main2.c cp: illegal option -- t
  • 我认为 -t 是一个 GNU 选项,而 Mac 不是 GNU。
【解决方案2】:

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

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

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

【讨论】:

  • 这正是我需要将窗口 id 列表(从xwininfo 的输出中截取和剪切)到xdotool 的管道,这样我就可以关闭一堆弹出的错误对话框。此语法适用于 zsh :)
【解决方案3】:

我愿意:

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

xargs 可能是最好的答案。

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

【讨论】:

  • 非常有用。很高兴解释各种选项及其逻辑。
【解决方案4】:

应该是:

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

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

您也可以进行测试:

cp `echo a b c` Directory

会将所有abc 复制到Directory

【讨论】:

  • 虽然这可能有效,但请注意Why you shouldn't parse the output of ls(1)
  • 你是对的。然而,很难按大小顺序列出文件,ls -SF 很简单。事实上,如果文件中有空格,这个解决方案是不正确的。
猜你喜欢
  • 2013-07-07
  • 2016-07-03
  • 2011-05-02
  • 2016-10-18
  • 2012-07-08
  • 1970-01-01
  • 2014-12-27
  • 2013-11-11
  • 2015-03-01
相关资源
最近更新 更多