如何使用通配符在 unix shell 上复制文件

Mar*_*tin 6 bash shell

我正在尝试将一些文件复制到现有文件夹中。这是架构的一个例子

# origin 
/home/user/myfiles/folder1/group1/1.jpg
/home/user/myfiles/folder1/group1/2.jpg
/home/user/myfiles/folder1/group2/1.jpg
/home/user/myfiles/folder1/group2/2.jpg
/home/user/myfiles/folder2/group1/1.jpg
/home/user/myfiles/folder2/group1/2.jpg
/home/user/myfiles/folder2/group2/1.jpg
/home/user/myfiles/folder2/group2/2.jpg
Run Code Online (Sandbox Code Playgroud)

目标文件夹架构已经存在,它只是不存在的原始文件 (jpg)。

我的问题是如何做到这一点?

我想最终得到类似下面的结果,但这不起作用。也许我应该在查询中包含正则表达式以将星号分隔为值并用作来源/目的地?

 cp /home/user/myfiles/*/*/*.jpg  /home2/user/myfiles/*/*/*.jpg
Run Code Online (Sandbox Code Playgroud)

我最初的打算是在我未回答的问题上使用此复制模式: s3cmd:如何将文件从本地复制到具有现有结构的 S3 存储桶作为可能的解决方案。

Ala*_*rry 4

通过 GNU cp,您可以使用该--parents选项,如下所示:

cd /home/user/myfiles ; cp --parents */*/*.jpg /home2/user/myfiles/
Run Code Online (Sandbox Code Playgroud)

你必须cd首先这样做,因为如果你cp --parents /home/user/myfiles/...这样做,也会创建那些父母,而你最终会得到/home2/user/myfiles/home/parents/myfiles/.

如果您需要非 GNUish 答案,传统的 unix 方法将通过管道进行 tar。

cd /home/user/myfiles ; tar cf - */*/*.jpg | ( cd /home2/user/myfiles ; tar xf - )
Run Code Online (Sandbox Code Playgroud)

第二个cd位于带有第二个 tar 的子 shell 中,因此这就是提取文件的位置。tarball 本身是同时创建、通过管道发送和提取的。v如果您想要进度报告,请向其中一个 tar添加一个标志。