我想检查当前目录中是否没有.txt文件。我如何在标准shell中执行此操作?
要求:
就简单性而言,它应该尽可能接近:
#! /bin/sh
[ -f ./*.txt ] || echo "Not found!"
答案 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,但如果您使用bash
和nullglob
,则可能为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