2014-01-09 38 views
1

我想只有在一个特定的文件类型的存在是为了执行一项任务 - 所以我有这个BASH如果 - 如果没有提供

if [ -e `find /directory -type f -name "*.filetype" | head -1`]; 
     then ... 

这是一直在评估真(即使像这样没有文件类型存在 - 我最终意识到这一点:

if [ -e ] 

评估为真(即如果没有给出 - 这发生在我的病情没有找到文件类型) - 有谁知道我应该怎样做才能得到我所需要的

回答

1

你的行会一直正确使用

if [ -n "`find /directory -type f -name '*.filetype'`" ] ; 

-n试验非空字符串。

如注释中所述,不赞成使用反引号语法而支持$()语法。

+0

什么版本的查找返回非零的有效查询没有结果? –

+0

@glennjackman哼我混淆了我脑海中的东西。感谢您的反馈意见。 – damienfrancois

+0

这不起作用的原因不是:'[-n]'返回true,因为当'['命令只能看到一个项目(“-n”)时,它会检查它是否是非空白,如果是则返回true。换句话说,它将“-n”视为要测试的字符串而不是操作员。解决方案是对命令替换部分进行双引号:'if [-n“$(find ... head -1)”];然后'注意我已经使用'$()'而不是反引号,因为语法有点干净,而''''之前的空格是必需的。 –

3

我最近才知道这个技巧:

if [[ $(find /directory -type f -name "*.filetype" 2>/dev/null) ]]; then 
    ... 
fi 
  • 我们标准错误重定向到/dev/null隐瞒任何错误消息
  • find输出将非空白,如果该文件符合这两个条件,否则将是空白的。
  • 如果find的输出分别为非空白或空白,则[[ ... ]]的计算结果为true或false。

我使用不同版本之前:

if find /directory -type f -name "*.filetype" 2>/dev/null | grep -q .; then 
    ... 
fi 

但是这是不太好的,因为它使用一个额外的grep过程。第一种解决方案与单个find流程相同。

+0

'$(find ...)'评估的结果是错误的还是会产生错误?我测试了名为“1 == 2”和“&&”的文件,它运行正常,但我想知道是否没有任何风险。 – damienfrancois

+2

@damienfrancois,在bash里'[[...]]',变量*不受*分词限制,所以这个构造只会检查输出的字符串长度。 –

+0

@glennjackman好的谢谢澄清 – damienfrancois

相关问题