在unix脚本中获得最高扩展值

时间:2016-11-30 18:04:30

标签: unix

我需要创建扩展名为:file.1,file.2,file.3的新文件,然后检查是否存在具有特定数字的文件并创建文件。(n + 1)其中n是最高的数,现有的文件。我试图使用basename获取扩展名,但它并不想获得几个文件

file=`basename $file.*`
ext=${file##*.}

仅当我输入$file.3

等整个文件名时才有效

3 个答案:

答案 0 :(得分:2)

如果文件名保证不包含换行符,则可以使用标准的unix文本处理工具:

printf '%s\n' file.* | #full list
sed 's/.*\.//' | #extensions
grep '^[0-9][0-9]*$' | #numerical extensions
awk '{ if($0>m) m=$0} END{ print m }' #get maximum

答案 1 :(得分:1)

这是我对此的看法。

您可以在标准awk中完全执行此操作。

$ awk '{ext=FILENAME;sub(/.*\./,"",ext)} ext>n&&ext~/^[0-9]+$/{n=ext}{nextfile} END {print n}' *.*

为便于阅读而破裂:

$ awk '
  {
    # Capture the extension...
    ext=FILENAME
    sub(/.*\./,"",ext)
  }

  # Then, if we have a numeric extension that is bigger than "n"...
  ext > n && ext ~ /^[0-9]+$/ {
    # let "n" be that extension.
    n=ext
  }

  {
    # We aren't actually interested in the contents of this file, so move on.
    nextfile
  }

  # No more files? Print our result.
  END {print n}
' *.*

这里的想法是,我们将逐步浏览文件名列表,让awk完成所有处理以捕获和排序"扩展。 (我们并没有真正排序,我们只是在通过文件时记录最高数字。)

这个解决方案有一些附带条件:

  1. 仅当所有文件的长度都为非零时才有效。技术上awk条件正在文件"的行上进行比较,所以如果没有行,awk将直接通过该文件。
  2. 您真的不需要使用ext变量,您可以直接修改FILENAME。我把它包括在内以提高可读性。
  3. nextfile命令是相当标准的,但不是通用命令。如果您有一台非常旧的机器,或者运行了各种各样的unix,则可能不包括nextfile。 (我不希望这是一个问题。)
  4. 另一种可能更容易实现的方法是直接在POSIX shell中实现相同的逻辑:

    $ n=0; for f in *.*; do ext=${f##*.}; if expr "$ext" : '[0-9][0-9]*$' >/dev/null && [ "$ext" -gt "$n" ]; then n="$ext"; fi; done; echo "$n"
    

    或者,再次分解以便于阅读(或编写脚本):

    n=0
    for f in *.*; do
      ext=${f##*.}
      if expr "$ext" : '[0-9][0-9]*$' >/dev/null && [ "$ext" -gt "$n" ]; then
        n="$ext"
      fi
    done
    echo "$n"
    

    使用for循环逐步浏览所有文件,捕获扩展名,确保它的数字,确定它是否大于" n"并记录它是否是,然后打印其结果。

    它不需要管道,也不需要外部工具,expr除外,它是每个系统都可用的POSIX.1工具。

    此解决方案的一个附带条件是,如果您没有带扩展名的文件(即*.*不返回任何文件),则此脚本将错误地报告编号最大的扩展名为0。你当然可以轻松地处理这个问题,但我想我应该提一下。

答案 2 :(得分:0)

感谢所有答案,我想出了一个非常相似和简单的想法,我想提出它:

for i in file.*; do
  #reading the extensions
  ext=${i##*.}
  if [ "$ext" -gt "$n" ];
    then
        #increasing n
        n=$((n+1))
  fi
done

然后,如果我们想让数字超过n

until [[ $a -gt "$n" ]]; do
    a=$((a+1))
done

最后a是一个大于文件扩展名的数字。因此,如果有三个文件:file.1 file.2 file.3,返回的值将为4.