bash - 如何在 find 命令中使用文件名中的变量?
问题描述
我正在尝试使用 find 命令来收集具有变量名的文件作为标题的一部分,并将它们移动到另一个目录。它是一个表示数组的循环变量,就像这样
for i in "${array[@]}"; do
find -name "${i}r.TXT" -a -name "${i}f.TXT" -execdir mv '{}' logs/ \;
done
我试图将它们移动到的目录是我当前工作目录的子目录,名为 logs。将变量集成到文件名中以便 find 获取正确的文件并将它们移动到日志目录的正确方法是什么?
数组的元素是整数,如 50、55、60、65 等,我想要 50f、50r、55f、55r 等文件。
解决方案
正如评论中指出的那样,-a
问题出在这里。find -name 1 -a -name 2
是相同的,find -name 1 -name 2
并且永远不会打印任何东西,因为名称不能1
同时2
。您可以-o
改用,但有一个更简单的解决方案:
用于find -name "${i}[fr].TXT"
查找文件50f.TXT
和50r.TXT
时间i=50
。
请注意戈登戴维森的评论:
find 搜索子目录(以及子子目录和...),因此它可能会在当前目录中找到文件,将它们向下移动到
logs/
,然后在 中再次找到它们logs/
,将它们向下移动到logs/logs/
(或至少尝试)等
为了防止这种情况,您可以排除log
通过添加-name logs -prune -o
作为第一个参数命名的目录find
。
但是,如果您的所有文件都在当前工作目录中,则您根本不需要find
。
Glob 也可以这样做:
shopt -s failglob
for i in "${array[@]}"; do
mv "${i}"[fr].TXT logs/
done
如果没有找到匹配的文件,Failglob 将打印一条错误消息。您可以忽略它,但生成的命令mv logs/
将打印一条错误消息。
推荐阅读
- ios - 如何将自定义 SCNTechnique 传递添加到特定区域,而不会弄乱 Sceneview 全屏区域的其余部分?
- git - Git - 区分大小写问题
- amazon-web-services - 服务器端加密与客户端加密 - Amazon S3
- python - 将 Pycharm 与 Oracle SQL 数据库连接起来?- 错误:DPI-1047
- ruby-on-rails - 我正在尝试在我的 rails 应用程序(rails 6)中使用 searchkick gem 实现弹性搜索。重新索引模型时出现 SystemStackError
- python - 如何在 Python 中的 IF 语句中从多个返回值中检查变量之一的值
- php - 在 $_GET 变量中存储和签名
- eclipse - Visual Studio Code 中的 Eclipse 插件支持?
- bittorrent - 我应该什么时候停止递归 `get_peers` DHT 搜索?
- flutter - Flutter:带有意图的android插件的警告