Bash:如何检查目录是否存在以及目录中是否包含文件

时间:2019-05-12 13:50:46

标签: bash if-statement

我要打印所有子目录名称,并在目录名称下方显示其内容文件名。如果子目录为空,则不要打印目录名称,而是转到下一个子目录。我的代码的适用部分:

for dirs in "$mydir"/*
do
   if [ -d "$dirs" -type f" ] && [ "find "$dirs" -type f" ]
   then
      echo "Processing directory $dirs"
         for subfiles in $dirs/*
         do
            echo "Encoding $subfiles"
         done
   fi
done

如果我忽略了第一个if语句的第二个条件,那么空目录将在屏幕上打印其名称,并且在该目录下面会显示一个*(我想代表了目录中什么都没有的事实)。 &&后面的部分不会引起任何错误,但不会阻止空目录查看此部分代码的其余部分。

如何使它正常工作?

4 个答案:

答案 0 :(得分:0)

更改条件以测试空目录:

for dirs in "$mydir"/*
do
   if [ -d "$dirs" ] && [ -n "$(ls -A $dirs)" ]
   then
      echo "Processing directory $dirs"
         for subfiles in $dirs/*
         do
            echo "Encoding $subfiles"
         done
   fi
done

答案 1 :(得分:0)

除了查看所有内容并检查每个文件是否是文件目录还是非空目录之外,为什么不仅要首先搜索文件和非空目录?

根据您的声明,I want to print out all sub-directory names with their content file names below the directory name.仅为:

find . -mindepth 2 -maxdepth 2 ! -path . -type f -print0 |
    awk -v RS='\0' -F'/' '!seen[$(NF-1)]++{print "dir", $(NF-1)} {print "file", $NF}'

例如:

$ find . -printf '%y %p\n'
d .
f ./file
d ./tmp1
d ./tmp2
f ./tmp2/bar
f ./tmp2/foo

$ find . -mindepth 2 -maxdepth 2 ! -path . -type f -print0 |
    awk -v RS='\0' -F'/' '!seen[$(NF-1)]++{print "Processing directory", $(NF-1)} {print "Encoding", $NF}'
Processing directory tmp2
Encoding bar
Encoding foo

适合的按摩。如果您需要在每个文件上执行shell命令,则无需参与awk,只需将以上内容更改为:

$ cat ../tst.sh
#!/bin/env bash
declare -A seen
while read -r -d '' line; do
    path="${line%/*}"
    dir="${path#*/}"
    file="${line##*/}"
    (( ! $(( seen[dir]++ )) )) && printf 'Processing directory %s\n' "$dir"
    printf 'Encoding %s\n' "$file"
done < <(find . -mindepth 2 -maxdepth 2 ! -path . -type f -print0)

$ ../tst.sh
Processing directory tmp2
Encoding bar
Encoding foo

答案 2 :(得分:0)

纯bash解决方案:

nat

它应该安全地处理以is_empty_dir() { [[ "*..." = "$(printf %s * .*)" ]]; } .开头的文件名。

如果当前目录为空,则退出状态为零,否则为非零。


用法示例:

-

答案 3 :(得分:0)

启用nullglob可能会简化事情:

shopt -s nullglob
if [ some/dir/* ]; then
    echo directory exists and is not empty
fi

设置nullglob后,不匹配任何内容的glob表达式将返回一个空字符串。