使用xargs将文件从本地系统复制到docker容器

时间:2020-09-22 10:46:12

标签: linux docker xargs

我有一个文件夹,其中包含约8000张图片,命名为img_991_990_0_drawing.jpg.jpg。我要将所有文件从本地系统复制到Docker容器中。

操作系统:Ubuntu 18.04.2 LTS

Docker:18.09.2

我尝试了sudo docker cp <source_path> <container_id>:<dest_path>并遇到了sudo: unable to execute /usr/bin/docker: Argument list too long

因此,我尝试通过xargs的方式find /data/projects/cad-detection/darknet/result_img/* | xargs /bin/cp 1f17d5044287:/home/dataturks/bazaar/uploads/2c91808274774ae60/复制所有文件

但是我会收到非目录错误

/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_2585_2581_0_drawing.jpg.jpg' is not a directory
/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_4076_4070_0_drawing.jpg.jpg' is not a directory
/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_5570_5560_0_drawing.jpg.jpg' is not a directory
/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_7052_7040_0_drawing.jpg.jpg' is not a directory
/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_999_998_0_drawing.jpg.jpg' is not a directory

我通常可以使用cp来复制文件,因此过去从未使用过xargs。我想我错过了一个选择。

如果您想知道为什么我要复制大量图像而不是一个文件夹,那么我正在使用DataTurks,并且我需要/bazaar/uploads/2c91808274774ae60中的文件才能通过本地主机访问它们。

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找:

find /data/projects/cad-detection/darknet/result_img/ -type f -print0 |
xargs -0 -iIMG docker cp IMG 1f17d5044287:/home/dataturks/bazaar/uploads/2c91808274774ae60/

首先,您在示例中使用的是/bin/cp,而不是docker cp

第二,当您有一个看起来像xargs的{​​{1}}命令时,这将产生格式为xargs <cmd> <arg1>的命令。要获得<cmd> <arg1> arg arg arg ...的正确语法,您需要使用docker cp选项来定义替换字符串,然后将其插入命令中的适当位置(因为目标目录必须是最后一个参数)。

为正确起见,刚发现的-i-print0的{​​{1}}就在那里;如果文件名包含空格,它们将使一切正常。


作为替代方案,考虑只使用-0

xargs

当然,这需要在您的容器中安装tar

相关问题