包含|的mv文件 xargs的

我只是试图将一堆文件(不是符号链接)从我的/ etc / apache / sites-enabled文件夹中移动到/ etc / apache / sites-available文件夹中,其中包含以下内容:

/etc/apache2/sites-enabled$ find . -maxdepth 1 -type f | xargs mv {} ../sites-available/ 

但我是一个ubuntu n00b,我收到此错误:

 mv: target `./real-file' is not a directory 

‘real-file’是我在开发环境中设置的测试文件。 我正试图在生产服务器上整理别人的烂摊子;-)

您可以使用find命令尝试-exec选项,

 /etc/apache2/sites-enabled$ sudo find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \; 

对于移动root拥有的文件,您需要sudo权限。

如果要使用xargs命令,请为其添加-I选项。

 find . -maxdepth 1 -type f | sudo xargs -I {} mv {} /etc/apache2/sites-available/ 

理想情况下,您应该将-print0与find一起使用,因此带空格的文件名不会搞砸。

这应该工作:

 find . -whatever-flags-go-here -print0 | xargs -r0 mv -t target-directory 

您还可以使用其他方式执行相同但具有额外性能

find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \+

请注意,它以\+结尾,这意味着find命令可以获取输出并扩展到{}执行您想要的操作,这样就可以避免两个选项( \; =为每个条目和管道输入新命令xargs

这是解释(你也可以查看手册man find

-exec command {} + -exec action的这个变体在所选文件上运行指定的命令,但命令行是通过在末尾附加每个选定的文件名来构建的; 命令的调用总数将远远少于匹配文件的数量。 命令行的构建方式与xargs构建命令行的方式大致相同。 命令中只允许一个“{}”实例。 该命令在起始目录中执行。