【问题标题】:Is `xargs` the way to go with this problem?`xargs` 是解决这个问题的方法吗?
【发布时间】:2011-11-23 22:23:32
【问题描述】:

我有一个文本文件,其中列出了我要移动的文件位置,首先到临时目录,在源目录中执行一些操作,然后将文件移回原始位置。

列表文件的格式是由查找命令生成的,例如:

~/$ find . -name "*.[ch]" > ~/tmp/my_file_list.txt

目前我正在使用sed 来操作屏幕上的文件,并剪切和粘贴其输出以发出命令。我觉得这很冒犯,但它确实有效:

~/$ sed -r 's_.+_cp & ~/tmp/_' ~/tmp/my_file_list.txt

(复制并粘贴输出,然后放回文件)

~/$ sed -r 's_.+/(.+)_cp ~/tmp/\1 &_' ~/tmp/my_file_list.txt

(复制...粘贴...畏缩)

如果没有复制和粘贴,我怎么能简单地完成上述两行...我在想 xargs 可能拥有我渴望的解决方案。

[编辑] 处理空格:

~/$ sed -r 's_.+_cp "&" ~/tmp/_' ~/tmp/my_file_list.txt

~/$ sed -r 's_.+/(.+)_cp "~/tmp/\1" "&"_' ~/tmp/my_file_list.txt

【问题讨论】:

  • 文件名是否包含空格?
  • 不,但你指出了一个普遍的案例缺陷......将编辑。

标签: bash scripting xargs


【解决方案1】:

只需将输出通过管道传输到bash

~/$ sed -r 's_.+_cp & ~/tmp/_' ~/tmp/my_file_list.txt | bash

【讨论】:

  • 我不知道你能做到这一点。谢谢。
【解决方案2】:

虽然我看到你已经得到了解决复制粘贴问题的答案,但我实际上建议使用rsync 来解决这个问题。顺序如下:

~/$ find . -name "*.[ch]" > ~/tmp/my_file_list.txt

备份:

~/$ rsync --files-from=tmp/my_file_list.txt . tmp/

对原始文件做任何事情,然后恢复:

~/$ rsync --files-from=tmp/my_file_list.txt tmp/ .

这具有(可以忽略不计的)优势,即不复制您尚未修改的文件,从而节省了一些磁盘活动。它有一个不可忽视的优势,如果您在不同目录中有多个同名文件,它们不会发生冲突,因为rsync 保留了相对路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2020-02-24
    • 1970-01-01
    相关资源
    最近更新 更多