如何在BASH中比较数字和文件名

时间:2017-01-15 20:56:29

标签: bash shell

我在文件夹中有多个文件,其文件名包含字母数字值。对于例如045_gfds.sql,46kkkk.sql,47asdf.sql等。我想比较这些文件名中的数字与存储在变量中的另一个数字,比如$×= 45,找出文件名中包含大于数字的文件。我正在使用Cygwin,目前只能使用egrep命令检索数字。例如。

filename="C:\scripts"
dir $filename | egrep -o [0-9]+ 

输出为:045 46 47

在比较大于$ = 45且所有文件名为:

之后,我希望输出为文件名
46kkkk.sql
47asdf.sql 

需要正则表达式的帮助来比较文件名中的大于值。

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

DIR="C:\scripts"
MAX=45
for FILE in "$DIR"/*
do
  if
    [[ "$FILE" =~ ^([0-9]+) ]]
  then
    NUMBER="${BASH_REMATCH[1]}"
    if
      [ "$NUMBER" -gt "$MAX" ]
    then
      echo "$FILE"
    fi
  fi
done

请注意我没有测试过此代码。它是特定于bash的,并假设数字始终位于文件名的开头。

答案 1 :(得分:0)

#!/bin/bash

dir="$1"

print_if_greater="45"

for fname in "$dir"/[0-9]*; do
    num="${fname##*/}"      # isolate filename from path
    num="${num%%[^0-9]*}"   # extract leading digits from filename

    if (( num > print_if_greater )); then
        printf '%s\n' "$fname"
    fi
done

上面的脚本将遍历给定目录中以至少一个数字开头的所有文件。

从路径中删除文件名,并使用bash的变量扩展语法提取文件名中的初始数字。

如果提取的数字大于$print_if_greater,则标准输出上会显示完整路径名。

使用您要检查的目录调用此脚本:

$ ./thescript.sh 'C:\scripts'

$ bash ./thescript.sh 'C:\scripts'

我无法访问Cygwin,因此我无法使用Window风格的路径进行测试。如果上述方法无效,请尝试使用C:/scripts作为路径。