复制具有相似目录结构的多个文件夹并在新位置维护结构

复制具有相似目录结构的多个文件夹并在新位置维护结构

想要做的事情可能非常简单,下面是目录结构:

/home/user/app-data/Unique container ID/path/to/files

我试过了:

cp -r /home/user/app-data/*/path/to/files /storage/location

显然,这会抓取我想要的所有文件,这些文件位于目标位置的最末端。我想将每个唯一目录结构中的最后一个文件夹复制到保存位置,并从唯一 ID 开始维护目录结构。因此,我抓取的每个文件夹的最终存储产品将如下所示:

/storage/location/Unique ID grabbed by the wildcard/path/to/files

答案1

cp复制源的叶子(路径的最后一部分),并在您的例子中*匹配一个或多个叶子对象。即使-r将以递归方式复制目录,最好还是使用-a来保留所有属性。

cp -r /home/user/app-data/* /storage/location

如果您需要更多高级过滤选项,您可以结合使用findcpio

在这个例子中我们仅复制目录结构:

find /home/user/app-data \
  -type d -links 2 -printf %P\\0 | \
   cpio -0 -pvdmu -D /home/user/app-data -- /storage/location

(事实上​​,没有子目录的目录只有两个硬链接...我们可以利用它-links 2来获取所有最终目录,无论您如何构建过滤器,最重要的是find具有cpio相同的起点)。

答案2

尝试这个:

for f in */path/to/files
  do
    d="${f%/*}"
    d="/path/to/files/storage/location/$d/"
    mkdir -p "$d"
    echo cp -r "$f" "$d"
  done
  • 第一的,更改/path/to/files为反映您想要的目录内的实际源路径Unique container ID,并保留它*之前的。

  • 下一个,更改/path/to/files/storage/location为您想要复制文件的实际目标路径,然后保留/其后面的。

  • 然后cd/home/user/app-data

  • 在那之后,运行上述代码进行试运行。

  • 最后echo,当对结果满意时,删除以进行实际复制。

相关内容