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

如何使用通配符在 unix 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

目标文件夹模式已经存在,只是原始文件(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存在更简单的命令...但是现在这样就可以了:)

相关内容