如何从多个子文件夹中查找文件并将其复制到其父文件夹中

how to find and copy files from many sub folders into it's parent folder

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

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

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

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

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

更新 我试过这个脚本:

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

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

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

要从末尾剥离一层目录结构,请尝试

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

parameter expansion ${p%pattern} 生成 p 的值,并从其末尾删除 pattern 上的最短可能匹配(或简单地 returns模式不匹配时的原始值)。

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

_ 只是一个占位符,它被分配给 [=22=],在这里根本没有使用。

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

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

不幸的是,cp -t 是一个 GNU 扩展;如果您的 OS 没有,您必须重新组织为与上述命令更相似的内容。