如何使用bash
测试目录中文件是否存在?
if ... ; then
echo 'Found some!'
fi
要清楚,我不想测试是否存在特定的文件。我想测试一个特定目录是否包含任何文件。
我去了:
(
shopt -s dotglob nullglob
existing_files=( ./* )
if [[ ${#existing_files[@]} -gt 0 ]] ; then
some_command "${existing_files[@]}"
fi
)
使用数组可以避免竞争条件两次读取文件列表。
答案 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
解决方案(不调用ls
或egrep
等外部程序)可按以下方式完成:
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
(不检查隐藏文件)