如何在Linux上使用xargs移动文件?


24

我正在尝试此操作,但无法正常工作:

ls file_* | xargs mv {} temp/

有任何想法吗?


有人对此有多文件移动版本吗?(xargs -n10例如)
Gert van den Berg

Answers:


31

在OS X上:

ls file_* | xargs -J {} mv {} temp/

在Linux上:

ls file_* | xargs -i {} mv {} temp/

1
至少在Linux上,/结尾处的可选。您可以根据需要包括它,但这不是必需的。
斯科特,

4
@ user1953864 :(-i-J)指定一个令牌,该令牌将被传入的参数替换,而不是仅将其附加到末尾。man xargs
阿玛丹

14
可能需要说-i{},没有空格。或者说-I {}
斯科特,

1
我注意到使用“%”代替“ {}”也可以-%是什么意思,{}是什么意思?示例:ls file_ * | xargs -I%mv%temp /
-dmonopoly

3
@dmonopoly:他们不意味着什么。无论参数-i是什么,它都将被替换。ls file_* | xargs -iFOO mv FOO temp/工作原理完全一样。
阿玛丹

8

find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;

findls文件可能比shell允许的程序参数数量更多的地方更好。


2
请注意,该问题表明只希望处理file_*当前目录中的文件,而find(没有其他选项)将搜索当前目录下的整个目录树。
斯科特,

1
没错。添加-maxdepth 0以防止这种情况。

“更好”是主观的。更强大,更复杂,更慢;虽然mv不在乎您是一起处理文件还是单独处理文件,但可能还有其他用途。
阿玛丹

编辑(添加-maxdepth 0

8

在mv上使用-t“指定目标目录”,它将文件*移动到目标目录/ temp

例如:-#ls -l文件* | xargs mv -t / temp


4

如@ user1953864所建议:{ -i-J}指定将被传入参数替换的令牌。

例如ls

something.java  exampleModel.java  NewsQueryImpl.java  readme someDirectory/

然后将所有java文件移动到someDirectory文件夹中,xargs如下所示:

在Linux上

ls *.java | xargs -i mv {} someDirectory/

在MacOS上

ls *.java | xargs -J mv {} someDirectory

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.