假设我有很多文件,例如:
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 调用)
最佳答案
您需要 mv
的 -t
选项。
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
关于shell - 如何拼接两个数据源(或将参数附加到动态参数列表)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20100693/