`xargs`是解决这个问题的方法吗?

时间:2011-09-23 19:27:13

标签: bash scripting xargs

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

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

~/$ 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

(复制......粘贴... wince)

我怎么能在没有复制和粘贴的情况下完成上述两行......我在想xargs可以保留我渴望的解决方案。

[编辑] 处理空格:

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

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

2 个答案:

答案 0 :(得分:3)

只需将输出管道输入bash

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

答案 1 :(得分:0)

虽然我看到你已经得到了解决复制粘贴问题的答案,但实际上我建议使用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会保留相对路径。