如何在bash中测试文件名扩展结果?

时间:2009-08-21 09:41:59

标签: bash shell

我想在bash中检查目录是否包含文件。 我的代码在这里。

for d in {,/usr/local}/etc/bash_completion.d ~/.bash/completion.d
     do              
         [ -d "$d" ] && [ -n "${d}/*" ] &&                         

         for f in $d/*; do                                                                                                           
             [ -f "$f" ] && echo "$f" && . "$f"                        

         done                                                                                                                        
     done

问题是“〜/ .bash / completion.d”没有文件。 所以,$ d / *被认为是简单的字符串“〜/ .bash / completion.d / *”,而不是空字符串,这是文件名扩展的结果。 作为该代码的结果,bash尝试运行

. "~/.bash/completion.d/*" 

当然,它会生成错误消息。

任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:6)

如果设置nullglob bash选项,请通过

shopt -s nullglob

然后globbing将丢弃与任何文件都不匹配的模式。

答案 1 :(得分:4)

# NOTE: using only bash builtins
# Assuming $d contains directory path

shopt -s nullglob

# Assign matching files to array
files=( "$d"/* )

if [ ${#files[@]} -eq 0 ]; then
    echo 'No files found.'
else
    # Whatever
fi

对数组的赋值还有其他好处,包括对包含空格的文件名/路径的理想(正确!)处理,以及不使用子shell的简单迭代,如下面的代码所示:

find "$d" -type f |
while read; do
    # Process $REPLY
done

相反,您可以使用:

for file in "${files[@]}"; do
    # Process $file
done

有一个好处,即循环由主shell运行,这意味着在循环中产生的副作用(例如变量赋值)对于脚本的其余部分是可见的。当然,如果性能是一个问题,它也会方式更快。
最后,还可以在命令行参数中插入数组(不分割包含空格的参数):

$ md5sum fileA "${files[@]}" fileZ

你应该总是试图正确处理包含空白区域的文件/路径,因为有一天它们会发生!

答案 2 :(得分:0)

您可以通过以下方式直接使用find

for f in $(find {,/usr/local}/etc/bash_completion.d ~/.bash/completion.d -maxdepth 1 -type f);
do echo $f; . $f;
done

但如果找不到某个目录,find将打印警告,如果目录存在,您可以在测试后放置2> /dev/null或放置find调用(如{在你的代码中。)

答案 3 :(得分:0)

find() {
 for files in "$1"/*;do
    if [ -d "$files" ];then
        numfile=$(ls $files|wc -l)
        if [ "$numfile" -eq 0 ];then
            echo "dir: $files has no files"
            continue
        fi
        recurse "$files"
    elif [ -f "$files" ];then
         echo "file: $files";
        :
    fi
 done
}
find /path

答案 4 :(得分:0)

另一种方法

# prelim stuff to set up d
files=`/bin/ls $d`
if [ ${#files} -eq 0 ]
then
    echo "No files were found"
else
    # do processing
fi