如何在 if 语句中使用 find 命令的结果并与 true 或 false 进行比较?
像这样的东西:
if [ `find . -name test.txt -size 156c`="true" ]; then echo Found; fi
这是整个脚本:
#!/bin/bash
if [ $# -ne 2 ]
then
echo Not enough params
fi
if [ `find . -name $1 -size $2c | grep -q .` -eq 0 ]
then
echo OK
fi
答案1
find
也许简单地将into的输出通过管道传输grep
就可以解决问题:
if find . -name test.txt -size 156c | grep -q .; then echo Found; fi
find
除非找到与您设置的名称和大小条件匹配的文件,否则调用将不会有输出,并且grep .
仅当其输入非空时才会有退出状态 0(“true”)。选项-q
要求不打印任何输出,这在这里无关紧要,因为我们只关心退出状态。
为了消除另一个可能的混乱来源:正如 @derobert 在评论中提到的,括号根本不是构造语法的一部分if
:您会发现存在一个名为 的命令[
,它负责评估布尔表达式,并且以退出代码的形式返回它们的真值([
也可以是内置的 shell);这个命令检查是否存在右括号:
$ [ 3 -gt 2 ] ; echo $?
0
$ [ 3 -lt 2 ] ; echo $?
1
$ [ 3 -lt 2 ; echo $?
bash: [: missing `]'
2
在上面的命令中,0 表示 true,1 表示 false,2 表示错误。
答案2
正如我在评论中所说,我认为你的问题实际上是
如何使用
find
命令测试单个文件以查看它是否满足find
测试,例如size
= 某个指定的数字?
其中文件名被指定为脚本的参数(因此您事先并不知道)。您正在围绕命令建立答案
if find . -name "$1" -size "$2"c | grep -q .
then
echo OK
fi
我冒昧地插入了 dhag 推荐的引文。这并不是一个糟糕的开始,但它有一些问题:
- 如果用户使用参数运行脚本
test.txt
,并且有一个名为test.txt
在当前目录的子目录中,然后find
会找到它并打印它的路径名,这样就会grep
成功。但是,如果您的脚本尝试对test.txt
当前目录中调用的文件执行某些操作,它将失败,因为没有这样的文件。
您可以通过添加-maxdepth 1
以防止find
查找子目录来解决此问题。 - 如果用户使用参数 运行脚本
my_subdir/test.txt
,find
则将失败,因为参数-name
可能不包含斜杠。 - 如果您有一个非常顽皮的用户,他可能
"*"
只是为了制造麻烦而打字。
find .
当您实际上不想搜索目录树时,使用似乎有点愚蠢。您知道文件的名称;你只是想测试它的属性。好吧,如果你闭上一只眼睛去读这本书的字里行间find(1)
,你就会意识到它实际上从未说过小路参数必须是目录——它只是暗示了这一点。事实证明你可以说
寻找 文件名 [表达]
应用于你的问题,这变成
find "$1" -size "$2"c
作为健全性检查,我建议:
if [ -f "$1" ] && find "$1" -size "$2"c | grep -q .
then
echo OK
fi
以避免在指定的文件根本不存在时收到错误消息find
(并防止上述恶作剧的用户为脚本提供目录名称)。
答案3
与其他地方提供的解决方案类似grep
,但也许更简单,您只需read
从find
.这将确保find
退出(因为read
肯定会)在第一场比赛中,给你一个可靠的回报值。
find . -name test.txt -size 156c |
read -r na && echo ok || ! echo shite
...应该工作得很好。如果find
打印任何内容,它将有一个尾随换行符,因此read
即使是来自 的单个匹配也将返回 true find
,但如果find
不打印任何内容,则将在读取换行符之前read
到达,因此它将返回错误。EOF
\n