2009-08-21 35 views
3

我想检查一个目录是否有文件或不在bash中。 我的代码在这里。如何在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/*" 

,当然,它产生错误消息。

任何人都可以帮助我吗?

+0

简而言之,我想知道如何为无效的文件名字符串强制扩展文件名。 – user159087 2009-08-21 09:44:22

回答

6

如果您设置的bash了nullglob选项,通过

shopt -s nullglob 

则通配符将下降不匹配任何文件的模式。

+0

kjshim的代码似乎对我很有用,因为它没有设置'nullglob'('shopt nullglob'返回“off”)。任何想法,为什么这可能是? – 2009-08-21 13:18:37

+0

也许你一直在尝试的目录不是空的? – 2009-08-21 13:26:15

+0

'ls -la test'显示'.'和'..' – 2009-08-21 17:01:45

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呼叫测试后如果目录存在(如你的代码)。

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 
+0

漂亮的代码。它有什么作用? – 2011-09-29 19:10:03

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 
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 

分配到一个阵列具有其他的好处,包括含白色空间,和简单的迭代的文件名/路径期望的(正确!)处理,而无需使用一个子如以下代码所示:

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

取而代之,您可以使用:

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

与环路内进行该循环由主壳运行,这意味着副作用(如变量赋值,说)下的权益是用于脚本的其余部分是可见的。当然,这也是方式更快,如果性能是一个问题。
最后,阵列也可以在命令行参数插入(不含空格拆分参数):

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

你应该总是尝试正确处理文件/包含空格的路径,因为有一天,他们会发生!

+0

对于文件glob扩展的很好例子,bash手册对这部分非常混淆! – 2011-08-23 00:15:31

相关问题