我想测试一个目录是否不包含任何文件。如果是这样,我将跳过一些处理。
我尝试了以下方法:
if [ ./* == "./*" ]; then
    echo "No new file"
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)
这给出了以下错误:
line 1: [: too many arguments
Run Code Online (Sandbox Code Playgroud)
有解决方案/替代方案吗?
And*_*pin 199
if [ -z "$(ls -A /path/to/dir)" ]; then
   echo "Empty"
else
   echo "Not Empty"
fi
Run Code Online (Sandbox Code Playgroud)
此外,检查该目录之前是否存在会很酷。
ps
ls -A 表示列出所有但.或..
slh*_*hck 33
无需计算任何东西或贝壳球。您也可以read与find. 如果find的输出为空,您将返回false:
if find /some/dir -mindepth 1 -maxdepth 1 | read; then
   echo "dir not empty"
else
   echo "dir empty"
fi
Run Code Online (Sandbox Code Playgroud)
这应该是便携式的。
uzs*_*olt 25
if [ -n "$(find "$DIR_TO_CHECK" -maxdepth 0 -type d -empty 2>/dev/null)" ]; then
    echo "Empty directory"
else
    echo "Not empty or NOT a directory"
fi
Run Code Online (Sandbox Code Playgroud)
        小智 17
#!/bin/bash
if [ -d /path/to/dir ]; then
    # the directory exists
    [ "$(ls -A /path/to/dir)" ] && echo "Not Empty" || echo "Empty"
else
    # You could check here if /path/to/dir is a file with [ -f /path/to/dir]
fi
Run Code Online (Sandbox Code Playgroud)
        小智 12
使用 FIND(1)(在 Linux 和 FreeBSD 下),您可以通过“-maxdepth 0”非递归地查看目录条目,并使用“-empty”测试它是否为空。应用于这个问题:
if test -n "$(find ./ -maxdepth 0 -empty)" ; then
    echo "No new file"
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)
        使用以下内容:
count="$( find /path -mindepth 1 -maxdepth 1 | wc -l )"
if [ $count -eq 0 ] ; then
   echo "No new file"
   exit 1
fi
Run Code Online (Sandbox Code Playgroud)
这样,您就独立于ls. -mindepth跳过目录本身,-maxdepth防止递归防御子目录以加快速度。
这将在当前工作目录 (.) 中完成工作:
[ `ls -1A . | wc -l` -eq 0 ] && echo "Current dir is empty." || echo "Current dir has files (or hidden files) in it."
Run Code Online (Sandbox Code Playgroud)
或将相同的命令拆分为三行以提高可读性:
[ `ls -1A . | wc -l` -eq 0 ] && \
echo "Current dir is empty." || \
echo "Current dir has files (or hidden files) in it."
Run Code Online (Sandbox Code Playgroud)
如果您需要在不同的目标文件夹上运行它,只需替换  ls -1A . | wc -l为ls -1A <target-directory> | wc -l。
编辑:我替换-1a为-1A(见@Daniel 评论)
使用数组:
files=( * .* )
if (( ${#files[@]} == 2 )); then
    # contents of files array is (. ..)
    echo dir is empty
fi
Run Code Online (Sandbox Code Playgroud)
        一种hacky,但只支持bash,无PID的方式:
is_empty() {
    test -e "$1/"* 2>/dev/null
    case $? in
        1)   return 0 ;;
        *)   return 1 ;;
    esac
}
Run Code Online (Sandbox Code Playgroud)
这利用了以下事实:test如果在 之后给出多个参数,则内置函数以 2 退出-e:首先,"$1"/*bash 扩展了 glob。这导致每个文件有一个参数。所以
如果没有文件,则中的星号test -e "$1"*不会扩展,因此 Shell 会回退到尝试文件 named *,该文件返回 1。
...除非实际上有一个文件名为 exact *,然后星号扩展为好,星号,最终与上述调用相同,即。test -e "dir/*",只是这次返回 0。(感谢 @TrueY 指出这一点。)
如果有一个文件,test -e "dir/file"则运行,返回 0。
但是如果文件多于 1,test -e "dir/file1" "dir/file2"
则运行,bash 将其报告为使用错误,即 2。
case 包装整个逻辑,以便只有第一种情况,退出状态为 1 报告为成功。
我没有检查过的可能问题:
文件数量多于允许的参数数量——我想这可能与 2+ 个文件的情况类似。
或者实际上有一个空名称的文件——我不确定在任何正常的 OS/FS 上是否可行。
小智 5
如何测试目录是否存在并且在一个 if 语句中不为空
if [[ -d path/to/dir && -n "$(ls -A path/to/dir)" ]]; then 
  echo "directory exists"
else
  echo "directory doesn't exist"
fi
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           193625 次  |  
        
|   最近记录:  |