首页 > 解决方案 > 如何从许多子文件夹中查找文件并将其复制到其父文件夹中

问题描述

我有三个级别的文件夹,例如mainsub-1sub-2。我的主文件夹有很多 sub-1 文件夹,每个 sub-1 都有很多 sub-2 文件夹,里面有 JPG 图像。

我正在尝试从 sub-2 中查找 JPG 文件并将其复制到其父 sub-1 文件夹中,即FROM主文件夹。

因此,我当前的解决方案是转到每个 sub-1 文件夹并使用此脚本从 sub-2 文件夹中查找所有 JPG 并将其复制到其父 sub-1 文件夹中。

find . -type f -name "*.jpg" -exec cp {} ./ \;

为什么下面的这个脚本不起作用?如何在不进入每个 sub-1 文件夹的情况下从主文件夹中查找和复制 JPG?

更新 我试过这个脚本:

find . -type f -name "*.jpg" -exec cp {} ../ \;

但这会将所有图像带到主文件夹而不是 sub-1 文件夹。

标签: bashubuntufindcpwsl-2

解决方案


..指当前工作目录的父目录。

要从最后剥离一级目录结构,请尝试

find . -type f -name "*.jpg" -exec sh -c 'for p; do
    cp "$p" "${p%/*/*}"
  done' _ {} +

参数扩展 ${p%pattern}产生的值从它的末尾删除(或者在模式不匹配时简单地返回原始值)ppattern

因为需要在设置文件名时评估参数扩展,所以我们将其包装起来sh -c '...',为了提高效率,我们将操作包装在一个for循环中,以便find可以将多个文件传递给单个 shell 调用(因此+而不是\;在结尾)。

_只是一个占位符,它被分配到$0这里根本不使用。

在不太一般的情况下,如果您只有一个目标文件夹,您可以直接对其进行硬编码,当然:

find . -type f -name "*.jpg" -exec cp -t sub-1 {} +

不幸的是,cp -t是一个 GNU 扩展;如果你的操作系统没有它,你必须重新组织成更类似于上述命令的东西。


推荐阅读