假设我有许多文件,例如:
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呼叫)
答案 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
-I
和xargs
选项
ls *34 | sed 's/34/\*/g' | xargs -n 1 -I file mv file target_dir
注意:解析ls
答案 2 :(得分:0)
您不需要sed
或xargs
。 mv
可以使用2个以上的参数,在这种情况下,除了最后一个参数之外的所有参数都被视为文件名,以移动到最后一个参数指定的目录。
for f in *34; do
mv ${f%34}* target_dir
done