使用 | xargs 复制文件

使用 | xargs 复制文件

我只是想将一堆文件(不是符号链接)从我的 /etc/apache/sites-enabled 文件夹移到 /etc/apache/sites-available 文件夹中,操作如下:

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

但是我是 ubuntu 新手并且遇到了这个错误:

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

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

答案1

您可以尝试-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/

答案2

理想情况下,您应该将 -print0 与 find 结合使用,这样带有空格的文件名就不会搞乱。

例如这应该有效:

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

mv -t可直接使用,xargs因为源文件位于参数列表的末尾:

   mv [OPTION]... -t DIRECTORY SOURCE...

   -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY

答案3

你也可以用另一种方式来执行相同的操作,但要使用额外表现

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

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

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

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

答案4

对我来说,我的版本mv没有-t选项,我的版本xargs没有-I选项。我甚至无法使用,-exec因为find首先我必须过滤这些结果。所以这就是我使用的:

for f in $(find -type f | grep 'key')
do
mv $f dest/
done

相关内容