bash - 如何从许多子文件夹中查找文件并将其复制到其父文件夹中
问题描述
我有三个级别的文件夹,例如main、sub-1和sub-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 文件夹。
解决方案
..
指当前工作目录的父目录。
要从最后剥离一级目录结构,请尝试
find . -type f -name "*.jpg" -exec sh -c 'for p; do
cp "$p" "${p%/*/*}"
done' _ {} +
参数扩展 ${p%pattern}
产生的值从它的末尾删除(或者在模式不匹配时简单地返回原始值)p
。pattern
因为需要在设置文件名时评估参数扩展,所以我们将其包装起来sh -c '...'
,为了提高效率,我们将操作包装在一个for
循环中,以便find
可以将多个文件传递给单个 shell 调用(因此+
而不是\;
在结尾)。
这_
只是一个占位符,它被分配到$0
这里根本不使用。
在不太一般的情况下,如果您只有一个目标文件夹,您可以直接对其进行硬编码,当然:
find . -type f -name "*.jpg" -exec cp -t sub-1 {} +
不幸的是,cp -t
是一个 GNU 扩展;如果你的操作系统没有它,你必须重新组织成更类似于上述命令的东西。
推荐阅读
- ios - 使用 UITableViewDiffableDataSource 时如何移动 UITableView 单元格?
- c++ - 通过采用迭代器的 C++ 函数包装采用原始指针的 C API
- c# - 在自定义控件上设置默认样式或控件模板
- javascript - 停止中继:查询渲染器为某些 setStates 重新加载数据
- sql - 有没有办法以类似于忽略匹配顺序的方式表达 AND?
- r - 使用 grepl 匹配某些单词,但仅限于不能出现其他单词的特定上下文中
- ansible - Ansible 丢失可变内容
- android - 如何在代码中而不是在清单中设置应用程序主题
- ios - 在特定 ViewController 上强制 RTL 方向
- solr - Solr 7.2 建议者 contextField 过滤器没有返回结果