如何拼接两个数据源(或将参数附加到动态参数列表)?

时间:2013-11-20 15:57:29

标签: shell unix command-line

假设我有许多文件,例如:

filetypea34
filetypeb34
somemoredata34
filetypea35
filetypeb35
somemoredata35
... and so on

我希望将所有这些文件(但不是整个目录)移动到新目录。或删除它们。知道shell使用*34展开的文件是代表性的“切片”:

ls *34 | sed 's/34/\*/g' | xargs mv target_dir

如果我想删除它们,这将非常有用,但我想将它们移动到新目录。上面的命令执行命令

mv target_dir filetypea* 
mv target_dir filetypeb* 
mv target_dir somemoredata*

显然不会起作用。

如何重新排序参数?我发现像tee的反面一样的东西会完成这个,例如获取流和参数的程序,将流写出,然后将参数(或将参数和流写入)写入其输出流。

另一种选择是,如果xargs允许我指定target_dir是一个坚持在arglist末尾的参数。 (虽然现在xargs正在调用mv 3次,我甚至不确定如何告诉它进入一个mv呼叫)

3 个答案:

答案 0 :(得分:2)

-t需要mv选项。

command1 | command2 | xargs mv -t target_dir

来自man mv

   mv [OPTION]... -t DIRECTORY SOURCE...

   ...

   -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY

编辑:如果您mv的变体不支持-t,您可以说:

   ... | xargs -0 -I {} mv {} target_dir

答案 1 :(得分:0)

尝试使用-n

-Ixargs选项
ls *34 | sed 's/34/\*/g' | xargs -n 1 -I file mv file target_dir

注意:解析ls

的输出不是一个好习惯

答案 2 :(得分:0)

您不需要sedxargsmv可以使用2个以上的参数,在这种情况下,除了最后一个参数之外的所有参数都被视为文件名,以移动到最后一个参数指定的目录。

for f in *34; do
    mv ${f%34}* target_dir
done