![如何使用通配符在 unix shell 上复制文件](https://linux22.com/image/1323374/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E9%80%9A%E9%85%8D%E7%AC%A6%E5%9C%A8%20unix%20shell%20%E4%B8%8A%E5%A4%8D%E5%88%B6%E6%96%87%E4%BB%B6.png)
我正在尝试将一些文件复制到现有文件夹中。这是架构的示例
# 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
目标文件夹模式已经存在,只是原始文件(jpg)不存在。
我的问题是如何做到这一点?
我希望最终得到类似下面的结果,但这样做行不通。也许我应该在查询中包含正则表达式,将星号分成多个值并用作原点/目的地?
cp /home/user/myfiles/*/*/*.jpg /home2/user/myfiles/*/*/*.jpg
我最初打算用这个复制模式来解决我未解答的问题: s3cmd:如何将文件从本地复制到具有现有结构的 S3 存储桶作为一种可能的解决方案。
答案1
使用 GNU cp 您可以使用该--parents
选项,如下所示:
cd /home/user/myfiles ; cp --parents */*/*.jpg /home2/user/myfiles/
您必须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 - )
第二个cd
位于第二个 tar 的子 shell 中,因此文件就是从那里提取的。tarball 本身的创建、通过管道发送和提取过程是同时进行的。v
如果您需要进度报告,请向其中一个 tar 添加一个标志。
答案2
下面的方法应该可以解决问题:
for i in `find /home/user/myfiles/folder1 -print`; do
if [ ! -d $i ];
then filePath=`echo $i | cut -f 4- -d"/"`;
cp $i /home/user/myfiles/folder2/$filePath;
fi;
done
基本上,我正在提取两个文件夹之间即将发生变化的文件名部分,然后发出复制命令。
注意“cut -f4-“以上 - 它获取从第 4 个开始的字段。您可以根据需要更改数字
或许甚至basename
存在更简单的命令...但是现在这样就可以了:)