Shell:如何检查目录中是否存在.txt文件?

时间:2014-11-01 10:44:30

标签: bash shell

我想检查当前目录中是否没有.txt文件。我如何在标准shell中执行此操作?

要求:

  • 必须使用任何sh(不仅是bash)
  • 必须高效(没有多个功能的单行?)

就简单性而言,它应该尽可能接近:

#! /bin/sh

[ -f ./*.txt ] || echo "Not found!"

5 个答案:

答案 0 :(得分:1)

试试这个:

if ls ./*.txt > /dev/null
then
    echo "File Exists"
else
    echo "File Doesn't exists"
fi

答案 1 :(得分:1)

(echo *.txt | grep -q '*') && echo not found

答案 2 :(得分:1)

使用find可能是个不错的选择:

#!/bin/sh

res=
res=$(find . -maxdepth 1 -name '*.txt' -type f -print -quit)

[ -n "$res" ] || echo 'Not found!'

可以缩短为:

#!/bin/sh

[ -n "$(find . -maxdepth 1 -name '*.txt' -type f -print -quit)" ] || echo 'Not found!'

这样做的好处是没有shell globs,只要找到find 文件就会*.txt退出。如果.txt文件太多,您将不会得到任何参数列表太长错误,在这种情况下它也会更快。

此外,使用-type f,我们确信我们只处理文件。如果没有.txt个文件但是目录名为whatever.txt,那么涉及globs的许多答案将会失败。


由于注释中的@chepner状态(谢谢!),POSIX未指定-maxdepth-quit,因此此解决方案不可移植(未指定-printf通过POSIX,但是-printf替换-print是一个微不足道的修复。

要修复-quit转换,我们将使用grep,如下所示:

find . -name '*.txt' -type f | grep -q . || echo 'Not found!'

只要grep读取一个字符,就会退出,关闭管道,find也会退出。 这将在子目录中递归(这可能是一种想要的行为)。

否则,如果你不想要递归:

find . -type d \! -name . -prune \! -type d -o -name '*.txt' -type f | grep -q . || echo 'Not found!'

答案 3 :(得分:1)

关注

( for f in *.txt; do [ -f "$f" ] && exit; done; exit 1 )
如果$?匹配任何内容,

*.txt将为0,否则为1。

(假设*.txt在没有匹配的情况下按字面处理,在POSIX shell中应该为true,但如果您使用bashnullglob,则可能为false选项已设置。)

(更新:我收录了gniourf_gniourf&#39}关于处理*.txt可能匹配的非常规文件的建议。)

答案 4 :(得分:0)

[ `printf *.txt` = '*.txt' ]

返回OP问题的答案

编辑:显式优于隐式

[ `printf *.txt` = '*.txt' ] && echo "Not found!"

编辑#2,谢谢你gniourf_gniourf

([ `printf *.txt` != '*.txt' ] || [ -f '*.txt' ]) && echo yes || echo no