在bash脚本中查找文件扩展名中的最大索引

在bash脚本中查找文件扩展名中的最大索引,bash,sh,Bash,Sh,所以我有一个文件夹,里面有一堆文件。 文件,文件.0,文件.1,文件.2 我正试图在这个文件的扩展名中找到最大的索引。所以它必须是2 我编写了这个命令,它统计所有扩展名为的文件。 但当指数大于10时,它不能正常工作。它根本不起作用,因为我只想找到最大的索引,而不是索引中包含数字的文件的总和。 $1 (is file name in this case File) y=$(echo $(ls -d $1.[0-inf] | wc -l)) 我怎样才能做到这一点?您可以尝试以下方法: for i

所以我有一个文件夹,里面有一堆文件。 文件,文件.0,文件.1,文件.2

我正试图在这个文件的扩展名中找到最大的
索引。所以它必须是2

我编写了这个命令,它统计所有扩展名为
的文件。
但当指数大于10时,它不能正常工作。它根本不起作用,因为我只想找到最大的索引,而不是索引中包含数字的文件的总和。

$1 (is file name in this case File)

y=$(echo $(ls -d $1.[0-inf] | wc -l))
我怎样才能做到这一点?

您可以尝试以下方法:

for i in file\.*; do echo ${i##*.}; done | sort -g | tail -n1
${i###*。}
正在删除文件名中最后一个
之前的所有内容

sort-g
是按数值排序

tail-n1
打印最后一个索引

更容易出错的方法是使用
find
命令,因为它将处理与模式不匹配的文件、文件名和空格

find -type f -name "file\.*" -exec bash -c 'echo ${1/*\.}' _ "{}" \; 2>/dev/null | sort -n | tail -n1
bash-c'echo${1/*\.}'{}
是一个命令,它将去除
前面的字符

您可能希望在命令开头添加
-maxdepth 1
,以避免递归地查看目录。

您可以尝试以下操作:

for i in file\.*; do echo ${i##*.}; done | sort -g | tail -n1
${i###*。}
正在删除文件名中最后一个
之前的所有内容

sort-g
是按数值排序

tail-n1
打印最后一个索引

更容易出错的方法是使用
find
命令,因为它将处理与模式不匹配的文件、文件名和空格

find -type f -name "file\.*" -exec bash -c 'echo ${1/*\.}' _ "{}" \; 2>/dev/null | sort -n | tail -n1
bash-c'echo${1/*\.}'{}
是一个命令,它将去除
前面的字符

您可能希望在命令开头添加
-maxdepth 1
,以避免递归地查看目录内部。

第一个提示:。尤其是你的情况

您可以在pure bash中使用以下脚本来解决您的问题:

#!/bin/bash

# needed for correct glob expansion
shopt -s nullglob

# we check every file following the format $1.extension
max_index=0
for f in $1.*
do
    # we retrieve the last extension
    ext=${f##*.}
    re="^[0-9]+$"

    # if ext is a number and greater than our max, we store it
    if [[ $ext =~ $re && $ext -gt $max_index ]]
    then
        max_index=$ext
    fi
done
echo $max_index
第一个提示:。尤其是你的情况

您可以在pure bash中使用以下脚本来解决您的问题:

#!/bin/bash

# needed for correct glob expansion
shopt -s nullglob

# we check every file following the format $1.extension
max_index=0
for f in $1.*
do
    # we retrieve the last extension
    ext=${f##*.}
    re="^[0-9]+$"

    # if ext is a number and greater than our max, we store it
    if [[ $ext =~ $re && $ext -gt $max_index ]]
    then
        max_index=$ext
    fi
done
echo $max_index

当参数
$1
文件.1
时会发生什么?是否要搜索名为
文件.1.0
文件.1.1
文件.1.2
等的文件?是。索引表示最后一个点后的值。当参数
$1
文件.1
时会发生什么情况?是否要搜索名为
文件.1.0
文件.1.1
文件.1.2
等的文件?是。索引是指最后一个点后的值。这个呢<代码>y=$(echo$(ls-d$1.[0-9]*|sed's/[^0-9]*///g'))对于v,在$y中的最大值=0;如果[$v-gt$max];当文件不存在时,max=$v fi done
@davoid:
ls:无法访问'nothing.[0-9]*':没有这样的文件或目录
。这就是为什么在这些情况下不使用
ls
。谢谢你提供的信息。但是我假设这个文件存在。@davoid也存在,如果你有这样的文件:
“file.0”、“file.0.0”、“file.0.1”
并用
$1==“file.0”
测试你的脚本,它将返回
max==“01”
而不是
max==1
@davoid是的,但问题是当你有
text.0.0
文本.0.1
,,
text.0.2
并使用
text.0
作为您的搜索文件这是怎么回事<代码>y=$(echo$(ls-d$1.[0-9]*|sed's/[^0-9]*///g'))对于v,在$y中的最大值=0;如果[$v-gt$max];当文件不存在时,max=$v fi done
@davoid:
ls:无法访问'nothing.[0-9]*':没有这样的文件或目录
。这就是为什么在这些情况下不使用
ls
。谢谢你提供的信息。但是我假设这个文件存在。@davoid也存在,如果你有这样的文件:
“file.0”、“file.0.0”、“file.0.1”
并用
$1==“file.0”
测试你的脚本,它将返回
max==“01”
而不是
max==1
@davoid是的,但问题是当你有
text.0.0
文本.0.1
,,
text.0.2
并使用
text.0
作为搜索文件如果没有遵循命名模式的文件,脚本将返回当前目录下所有文件的列表如果没有遵循命名模式的文件,脚本将返回当前目录下所有文件的列表