如何从shell脚本中搜索多个文件扩展名

时间:2017-02-01 10:04:18

标签: bash sed grep

for file in "$1"/*

 do

    if [ ! -d "${file}" ] ; then

   if [[ $file == *.c ]]

    then
blah

blah

上面的代码遍历目录中的所有.c文件并执行一些操作。我想要包含.cpp,.h,.cc文件。如何检查同一条件中的多个文件扩展名?

由于

3 个答案:

答案 0 :(得分:3)

您可以使用布尔运算符组合条件:

if [[ "$file" == *.c ]] || [[ "$file" == *.cpp ]] || [[ "$file" == *.h ]] || [[ "$file" == *.cc ]]; then
    #...
fi

另一种选择是使用正则表达式:

if [[ "$file" =~ \.(c|cpp|h|cc)$ ]]; then
    #...
fi

答案 1 :(得分:3)

为什么不迭代选定的文件扩展名?

#!/bin/bash

for file in ${1}/*.[ch] ${1}/*.cc ${1}/*.cpp; do
    if [ -f $file ]; then
        # action for the file
        echo $file
    fi
done

答案 2 :(得分:3)

使用扩展模式,

# Only necessary prior to bash 4.1; since then,
# extglob is temporarily turn on for the pattern argument to !=
# and =/== inside [[ ... ]]
shopt -s extglob nullglob

for file in "$1"/*; do
    if [[ -f $file && $file = *.@(c|cc|cpp|h) ]]; then
        ...
    fi
done

扩展模式也可以生成文件列表;在这种情况下,肯定需要shopt命令:

shopt -s extglob nullglob
for file in "$1"/*.@(c|cc|cpp|h); do
    ...
done