我需要创建扩展名为:file.1,file.2,file.3的新文件,然后检查是否存在具有特定数字的文件并创建文件。(n + 1)其中n是最高的数,现有的文件。我试图使用basename获取扩展名,但它并不想获得几个文件
file=`basename $file.*`
ext=${file##*.}
仅当我输入$file.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完成所有处理以捕获和排序"扩展。 (我们并没有真正排序,我们只是在通过文件时记录最高数字。)
这个解决方案有一些附带条件:
ext
变量,您可以直接修改FILENAME
。我把它包括在内以提高可读性。nextfile
命令是相当标准的,但不是通用命令。如果您有一台非常旧的机器,或者运行了各种各样的unix,则可能不包括nextfile
。 (我不希望这是一个问题。)另一种可能更容易实现的方法是直接在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.