首页 > 解决方案 > 如何在 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 等文件。

标签: bashshell

解决方案


正如评论中指出的那样,-a问题出在这里。find -name 1 -a -name 2是相同的,find -name 1 -name 2并且永远不会打印任何东西,因为名称不能1同时2。您可以-o改用,但有一个更简单的解决方案:

用于find -name "${i}[fr].TXT"查找文件50f.TXT50r.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/将打印一条错误消息。


推荐阅读