将ls输出转换为整数

Converting ls output to an integer

本文关键字:整数 转换 输出 ls      更新时间:2023-10-16

我想从ls输出中提取一组2位数的数字,并能够从中获得最大和最小的数字,以便以后使用。

我正在这样做:ls 14_data_*.log | egrep -o '[0-9]{2,2}' | head -1},但输出有时只是按升序,并且headtail的预期返回错误的值。我试着把它转换成整数,但没有希望。

ls返回了什么?如何处理?

ls返回当前目录中的文件和目录列表。

我不知道你在做什么,但这里有一个使用sort:解决问题的方法

降序:

ls 14_data_*.log | egrep -o '[0-9]{2}' | sort -nr

升序:

ls 14_data_*.log | egrep -o '[0-9]{2}' | sort -n

我真的不认为您需要在这里使用ls。如果你确定你的文件名不包含换行符,你可以使用这个:

printf '%sn' 14_data_*.log | grep -Eo '[0-9]{2}'

然后将其管道传输到sort -n,使用-r反转排序顺序。

我认为这是一个XY问题。

我如何理解您想要什么:您在当前目录中有一些文件与glob 14_data_[0-9][0-9].log匹配。您想要从glob [0-9][0-9]中提取最小和最高的数字。

例如,给定列表

14_data_1.log
14_data_09.log
14_data_13.log
14_data_87.log
14_data_aa.log

您需要数字0987,分别作为最小值和最大值。

这里有一个简单的纯Bash方法来实现这一点:

shopt -s nullglob
files=( 14_data_[0-9][0-9].log )
fnumbers=( "${files[@]#14_data_}" )
fnumbers=( "${fnumbers[@]%.log}" )
if (( ${#fnumbers[@]} == 0 )); then
    echo "No files found."
else
    printf 'min=%dnmax=%dn' "$((10#${numbers[0]}))" "$((10#${numbers[-1]}))"
fi
  • shopt -s nullglob:如果没有匹配,则使globs扩展为空
  • files=( 14_data_[0-9][0-9].log ):用所有匹配的文件填充数组files
  • fnumbers=( "${files[@]#14_data_}" ):用去掉前导14_data_files字段填充数组fnumbers
  • fnumbers=( "${fnumbers[@]%.log}" ):并从此数组中删除尾随的.log

此时,您有一个数组fnumbers,它包含(在本例中):( 09 13 87 )

我们最后选择这个数组的第一个和最后一个元素,得到最低和最高的数字。