【问题标题】:Why does find command in if return "paths must precede expression" error?为什么如果返回“路径必须在表达式之前”错误中的查找命令?
【发布时间】:2021-07-28 06:02:14
【问题描述】:

下面是我的 ksh 脚本。对于第一个 if 测试条件,我收到 paths must precede expression 错误。为了检查 if..find 的语法是否正确,我添加了第二部分并正确收到消息 pass 2 - found files

我还验证了以下 find 命令成功运行并返回了我想要的正确文件。我尝试在 PAY*.txt 周围加上双引号,并在星号 'PAY*.txt' 之前加上反斜杠,但没有运气。

find -iname 'PAY*.txt' -newermt '2021/04/22 00:00' ! -newermt '2021/04/22 23:59' -print

我猜这个问题可能是 p_date1 和 p_date2 被传递了,但我又不知道足够多,无法解决它。任何帮助将不胜感激。

#!/bin/ksh

p_date1='2021/04/22 00:00'
p_date2='2021/04/22 23:59'

if test -n "$(find -iname 'PAY*.txt' -newermt $p_date1 ! -newermt $p_date2 -print)";
then
  echo 'Files exist to upload'
else
  echo 'No Payment files exist to upload'
fi

if test -n "$(find -iname 'PAY*.txt' -ls)";
then
  echo 'pass 2 - found files'
else
  echo 'pass 2 - no files'
fi

谢谢。

【问题讨论】:

  • 只需在-iname 之前添加一个点('从这个目录开始')作为参数。
  • 我无法解释为什么您会看到 pass 2 - found files。也许您在此处显示的代码不是您实际运行的代码,或者您有一些非标准的find。通常,您会写find /p/a/t/h -iname ... 告诉find 要查看的目录。
  • @Roadowl 是的,我尝试了第一个 if 的点和相同的错误,第二个 if 的成功。
  • ShellCheck 自动检测这个不带引号的变量扩展问题
  • @maskeerr,顺便说一句,回复:您已删除的“答案”以及后续问题,请注意 for item in $(anything) 本身就是不好的做法。请参阅 BashPitfalls #1 说明原因以及更安全的替代方法,请参阅 UsingFind 关于操作的部分(即第 5 到第 7 部分)。

标签: linux shell ksh


【解决方案1】:

问题在于日期变量 - 如果您正确阅读了 find 的输出,您也会注意到这一点。

if test -n "$(find . -iname 'PAY*.txt' -newermt "$p_date1" ! -newermt "$p_date2" -print)";

注意变量名的双引号。

【讨论】:

  • 进一步详细说明该发现...您看到的错误是因为小时组件被 find 解释为裸字符串,假设它是一条路径,因此告诉您它需要去前面(Roadowl 的. 去的地方)。
  • OMG (facepalm) - 我尝试了单引号并遇到了其他错误,并且从没想过变量周围的双引号,因为整个命令都在双引号中:-(显然是一个菜鸟错误:- (
  • 找到文件后,我还想在for循环中一个接一个地处理文件。我尝试了一个简单的命令(如 cp)将找到的文件复制到其他扩展名,但文件名返回为 ./PAY_9440734.txt。获取文件名的正确方法是什么? ``` for pfile in "$(find . -iname 'PAY*.txt' -newermt "$p_date1" !-newermt "$p_date2" -print)";做回声'文件:'$pfile cp $pfile $pfile'.srk'完成```
  • 不确定我是否看到您的问题。 ./PAY_9440734.txt 一个有效的文件名,前缀为./你面临什么问题?
  • 这完全可行是一场悲剧。 GNU find 玩得又快又松,违反了标准,该标准明确指出路径是必需的。 IOW,此解决方案仅适用于 GNU find。为了可移植性,您必须指定搜索路径。例如find . -iname ...
猜你喜欢
  • 1970-01-01
  • 2014-09-15
  • 2014-02-13
  • 2012-05-29
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 2016-03-28
  • 2023-03-25
相关资源
最近更新 更多