sh:测试文件是否存在

时间:2012-01-19 05:26:28

标签: bash sh

如何使用bash测试目录中文件是否存在?

if ... ; then
   echo 'Found some!'
fi

要清楚,我不想测试是否存在特定的文件。我想测试一个特定目录是否包含任何文件。


我去了:

(
   shopt -s dotglob nullglob
   existing_files=( ./* )
   if [[ ${#existing_files[@]} -gt 0 ]] ; then
      some_command "${existing_files[@]}"
   fi
)

使用数组可以避免竞争条件两次读取文件列表。

8 个答案:

答案 0 :(得分:11)

从手册页:

   -f file
          True if file exists and is a regular file.

所以:

if [ -f someFileName ]; then echo 'Found some!'; fi

编辑:我看到你已经得到了答案,但为了完整起见,你可以使用Checking from shell script if a directory contains files中的信息 - 如果你想忽略隐藏文件,就会丢失dotglob选项。

答案 1 :(得分:7)

我通常只使用便宜的ls -A来查看是否有回应。

伪也许-正确语法-示例-嗨:

if [[ $(ls -A my_directory_path_variable ) ]] then....

编辑,这将有效:

myDir=(./*) if [ ${#myDir[@]} -gt 1 ]; then echo "there's something down here"; fi

答案 2 :(得分:4)

您可以在ls语句中使用if

if [[ "$(ls -a1 | egrep -v '^\.$|^\.\.$')" = "" ]] ; then echo empty ; fi

或者,感谢ikegami,

if [[ "$(ls -A)" = "" ]] ; then echo empty ; fi

或者更短:

if [[ -z "$(ls -A)" ]] ; then echo empty ; fi

这些基本上列出了当前目录中的所有文件(包括隐藏的文件),这些文件既不是.也不是..

如果该列表为空,则该目录为空。

如果要对隐藏文件进行折扣,可以将其简化为:

if [[ "$(ls)" = "" ]] ; then echo empty ; fi

bash解决方案(不调用lsegrep等外部程序)可按以下方式完成:

emp=Y; for i in *; do if [[ $i != "*" ]]; then emp=N; break; fi; done; echo $emp

这不是世界上最漂亮的代码,它只是将emp设置为Y,然后,对于每个真实文件,将其设置为N并且从for循环中断以提高效率。如果文件为零,则保持为Y

答案 3 :(得分:3)

试试这个

if [ -f /tmp/foo.txt ]
then
    echo the file exists
fi

参考:http://tldp.org/LDP/abs/html/fto.html

您可能还想查看一下:http://tldp.org/LDP/abs/html/fto.html

目录是否为空<= p>

$ find "/tmp" -type f -exec echo Found file {} \;

答案 4 :(得分:1)

#!/bin/bash

if [ -e $1 ]; then
        echo "File exists"
else 
       echo "Files does not exist"
fi 

答案 5 :(得分:1)

我没有一个好的纯sh / bash解决方案,但在Perl中很容易做到:

#!/usr/bin/perl

use strict;
use warnings;

die "Usage: $0 dir\n" if scalar @ARGV != 1 or not -d $ARGV[0];
opendir my $DIR, $ARGV[0] or die "$ARGV[0]: $!\n";
my @files = readdir $DIR;
closedir $DIR;
if (scalar @files == 2) { # . and ..
    exit 0;
}
else {
    exit 1;
}

将其称为emptydir,并将其放在$PATH中,然后:

if emptydir dir ; then
    echo "dir is empty"
else
    echo "dir is not empty"
fi

如果你没有给它任何参数,两个或多个参数,或者一个不是目录的参数,它就会出现错误消息;如果你喜欢不同的行为,那就很容易改变。

答案 6 :(得分:1)

# tested on Linux BASH

directory=$1

if test $(stat -c %h $directory) -gt 2;
then
   echo "not empty"
else
   echo "empty"
fi

答案 7 :(得分:0)

为了好玩:

if ( shopt -s nullglob ; perl -e'exit !@ARGV' ./* ) ; then
   echo 'Found some!'
fi

(不检查隐藏文件)