包含|的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构建命令行的方式大致相同。 命令中只允许一个“{}”实例。 该命令在起始目录中执行。