带|的mv文件 xargs


18

我只是想通过以下方法将一堆文件(不是符号链接)从/ 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

其中“真实文件”是我在开发环境中设置的测试文件。我正在尝试整理生产服务器上其他人的混乱状况;-)

Answers:


27

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

/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/

7

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

例如,这应该工作:

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

0

您还可以使用另一种方法执行相同的操作,但是性能更高

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

请注意,它的结尾\+是find命令获取输出并扩展为{}执行所需操作的方式,这样就避免了两个选项(\;对于每个条目=,并且将其管道输送到新命令中xargs

这是说明(您也可以查看手册man find

-exec命令{} + -exec操作的此变体在选定的文件上运行指定的命令,但是通过在末尾附加每个选定的文件名来构建命令行。该命令的调用总数将远远少于匹配文件的数目。命令行的构建与xargs构建命令行的方式几乎相同。 命令中仅允许使用一个'{}'实例。该命令在起始目录中执行。

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.