我需要找到.c文件指定的目录

时间:2015-12-03 10:16:04

标签: shell

我的目录名为dir/sub_dir,在该目录中我有*.c个文件:

add_num.c
sub_num.c
mul_num.c
div_num.h
exp.txt

如果我发现任何文件,我必须在If语句中使用它。喜欢

If any name is found means ok Else no files found

如何在If语句中使用?

1 个答案:

答案 0 :(得分:0)

您可以根据是否找到与find匹配的文件,使用'*.c'或提供可用退货的任何其他实用程序。 ls同样有效:

if ls "$dir"/*.c >/dev/null 2>&1; then
    echo "have .c files"
else
    echo "no .c files"
fi

其中$dir包含所需的路径。作为单行

if ls "$dir"/*.c >/dev/null 2>&1; then echo "have .c files"; else echo "no .c files"; fi

任意目录/任何扩展的通用版本

通过允许用户输入要搜索的目录并找到扩展名,您可以轻松地使脚本成为常规扩展搜索。下面的脚本是一个通用版本,通过 default 在当前目录中搜索.c个文件,但会搜索作为第一个参数输入的任何目录以及作为第二个参数输入的任何扩展名: / p>

#!/bin/bash

dir=${1:-.}
ext=${2:-c}

if ls "$dir"/*."$ext" >/dev/null 2>&1; then
    printf "have .%s files\n" "$ext"
else
    printf "no .%s files\n" "$ext"
fi

<强>实施例

$ bash ~/scr/utl/search_ext.sh debug txt
have .txt files

$ ls -l1 debug/*.txt
debug/array.txt
debug/data.txt

$ bash ~/scr/utl/search_ext.sh debug foo
no .foo files

(没有.foo个文件)

检测是否还存在非.c扩展程序

这会稍微改变一下,但要确定某个目录是否包含带有.c扩展名的文件以外的文件,您必须检查每个文件。在POSIX shell中,您可以使用expr string : regex功能来检查模式。 (在bash中有几种不同的方法可以做到这一点)。以下内容将满足您的需求:

for i in "$dir"/*; do ## test that each is a 'file' and has .c ext
    if [ -f "$i" -a $(expr "$i" : ".*.c") -eq 0 ]; then 
        echo "non '.c' files"  ## print error & exit on non .c file
        exit 1
    fi
done

echo "have .c files"  ## we are here -- they are all .c files

使用Bash参数扩展

#!/bin/bash

dir=${1:-.}

for i in "$dir"/*; do ## test that each is a 'file' and has .c ext
    if [ -f "$i" -a ${i##*.} != "c" ]; then 
        echo "non '.c' files"  ## print error & exit on non .c file
        exit 1
    fi
done

echo "have .c files"  ## we are here -- they are all .c files

这比POSIX使用expr要快。

提示搜索目录

您发布的代码没有多大意义。 (并且有许多缺少';'done语句,并且您从未使用过path)无需更改为用户输入的目录。如果您这样做,就像在代码中那样,您必须更改第二个循环。这是一个提示搜索目录的更新,如果搜索路径中存在子目录,则会退出:

#!/bin/bash

printf "enter path: "
read -r dir

dir=${dir%/}  ## check/trim trailing '/'

if [ ! -d "$dir" ]; then    ## validate dir exists
    echo "error: No such directory '$dir'"
    exit 1
fi

for i in "$dir"/*; do ## test that each is a 'file' and has .c ext
    ## if you want to exit if a subdir exists, just add -d test
    if [ -d "$i" ]; then
        echo "subdirectory present"
        exit 1
    fi
    if [ -f "$i" -a ${i##*.} != "c" ]; then 
        echo "non '.c' files"  ## print error & exit on non .c file
        exit 1
    fi
done

echo "have .c files"  ## we are here -- they are all .c files

您可以根据自己的喜好定制。