【问题标题】:Test if file exist, bash script [duplicate]测试文件是否存在,bash脚本[重复]
【发布时间】:2012-09-11 06:00:46
【问题描述】:

可能重复:
Checking if a directory contains files

我想查看一个目录是否为空,所以我使用[如下:

[ -f "./ini/*"]

并且返回值始终为 1,即使目录不为空。 有什么想法吗?

【问题讨论】:

标签: bash shell


【解决方案1】:

试试这个:

$ echo "*"   #With quotes

对比

$ echo *    #No quotes

看到区别了吗?当您在字符串周围加上引号时,shell 不能 glob 用匹配的文件替换星号。

有多种方法可以得到你想要的。最简单的是使用ls 命令而不使用测试命令。 if 语句获取您给它的命令 的输出结果。 [...] 只是test 命令的别名。这两个语句是等价的:

$ if test -f foo.txt

$ if [ -f foo.txt ]

基本上,如果测试为真,测试命令所做的所有事情就是返回0,如果测试为假,则返回非零值。所有if 命令所做的就是执行if 语句,如果它给出的命令返回一个0 退出代码。我之所以这样做,是因为让我们忘记测试,只需使用ls 命令。

假设您有一个文件foo.txt,但没有文件bar.txt。请尝试以下操作:

$ ls foo.txt > /dev/null 2>&1
$ echo $?
0
$ ls bar.txt > /dev/null 2>&1
$ echo $?
2

> /dev/null 2>&1 用于禁止所有输出。请注意,当文件存在时ls 命令的退出代码是0,而当文件不存在时ls 命令的退出代码不是0。 (在这种情况下是2)。现在,让我们使用它来代替 test 命令:

if ls ./ini/* > /dev/null 2>&1
then
    echo "There are files in that directory!"
else
    echo "There are no files in that directory"
fi

请注意,我什至不关心测试命令(可以是单词test[..])。

希望这对您有意义。人们有时很难意识到在 BASH shell 中,if 命令和[...] 是两个独立的命令,if 所做的只是运行它给出的命令,然后根据命令它运行。

【讨论】:

  • 在语义上很迂腐,[ 是一个命令,但if 不是。相反,if 是 shell 的关键字。
【解决方案2】:

注意以“.”开头的文件名,正常通配或使用ls (颤抖) 不会检测到这些有几种方法可以做到这一点,我能想到的最简单的是:

/home/user1> mkdir ini
/home/user1> cd ini
/home/user1/ini> touch .fred jim tom dick harry
/home/user1/ini> cd ..
/home/user1> declare -a names
/home/user1> names=(./ini/* ./ini/.*)
/home/user1> number_of_files=$(( ${#names[@]} -2 ))
/home/user1> echo $number_of_files
5

-2 是从列表中删除 ... 所必需的。

【讨论】:

  • 也可以考虑nullglobdotglob ;)
【解决方案3】:
if find ./ini/ -maxdepth 0 -empty | read;
then
echo "Not Empty"
else
echo "Empty"
fi

【讨论】:

  • | read 在那里做什么?这不是隐藏输出的方法..
  • 读取既要丢弃输出,又要使表达式仅在读取某些内容时才计算为真(即 /some/dir/ 被 find 发现为空)。
  • 如果find 没有找到任何文件,它将返回1。如果要隐藏输出,请使用 &>/dev/null 表示 Bash,使用 1>/dev/null 2>&1 表示 sh。
  • 去掉了test,这很好。然而,一个简单的ls ./ini/* > /dev/null 2>&1 会更快更容易。
【解决方案4】:

如果下面命令的输出是0,那么目录中没有文件(目录为空),否则它有文件!

$find "/path/to/check" -type f -exec echo {} \;|wc -l

所以对你来说-

exist=`find "./ini" -type f -exec echo {} \;|wc -l`
if [ $exist -gt 0 ]
then
   echo "Directory has files"
else
   echo "Directory is empty"
fi

或者

if [ `find "./ini" -type f -exec echo {} \;|wc -l` -gt 0 ]
then
   echo "Directory has files"
else
   echo "Directory is empty"
fi

【讨论】:

    【解决方案5】:

    这对我有用

    [ "$(ls -A /path/to/directory)" ]
    

    在你的情况下是

    [ "$(ls -A ./ini/)" ]
    

    您可以使用

    进行测试
    [ "$(ls -A /tmp)" ] && echo "Not Empty" || echo "Empty"
    

    【讨论】:

    猜你喜欢
    • 2019-03-02
    • 2011-07-19
    • 2013-04-01
    • 1970-01-01
    • 2023-01-20
    • 2012-05-26
    • 2013-12-07
    • 2012-07-04
    • 2012-10-25
    相关资源
    最近更新 更多