识别名称为目录中最大数字的文件夹

Identifying folder with name as largest number in the directory

有一个目录包含以数字命名的文件夹,我必须在该目录中找到编号最大的文件夹。 这是我为查找该文件夹而编写的脚本:

files='ls path/'
var=0

for file in $files
do
    echo $file
    tmp=$((file-"0"))
    if [ $tmp -gt $var ]
    then 
        var=$tmp
    fi
done

echo $var

但它不起作用。使用命令 sudo ./restore2.sh.

调用脚本后出现以下错误
ls
path/
./restore2.sh: line 6: path/: syntax error: operand expected (error token is "/")
0

您使用的是单引号而不是反引号 files='ls path/'。它试图将它用作文字字符串而不是对其进行评估。 此外,对于该特定任务,您可以这样做:

ls test | awk '{if( > largest){largest = }} END{print largest}'

简单一点。

改为使用查找:

find . -maxdepth 1 -type d -regextype "posix-extended" -regex "^.*[[:digit:]]+.*$" | sort -n | tail -1

将 maxdepth 设置为 1 以仅检查此目录中的目录,而不检查更深的目录。将正则表达式类型设置为 posix-extended 并搜索具有一位或多位数字的所有目录。打印结果并通过 sort 排序,然后用 tail -1 取最大的。

path/里面有文件吗?好像是空的。
应该 收到完全不同的投诉...

您不需要文件名中的路径信息。与其用 ${file##*/} 剥离它,不如去那里使用非路径名称。

以您自己的逻辑为基础的改编 -

cd /whatever/path/                     # go where the files are
var=-1                                 # initialize comparator 
for file in [0-9]*                     # each entry that starts with a digit
do [[ "$file" =~ [^0-9] ]] && continue # skip any file with nondigit contents
   [[ -f "$file" ]]        || continue # only process plain files
   (( file > var )) && var=$file       # remember largest seen 
done
echo $var                              # report largest

如果您确定不会有负数文件名,应该这样做。
如果可以有有效的负数,那么你的初始化需要适当降低,非数字的排除应该包括减号,以及文件列表到select.

请注意,此 doesn't parse ls 不需要通过 sort 进行管道传输或生成任何其他进程——它全部在 bash 解释器中处理,应该非常高效。

如果您确定自己的数据,并且知道目录中没有任何负片或仅命名为 0 的文件或与 [0-9]* 模式匹配的非普通文件条目,您可以将其简化为

cd /whatever/path/                     # go where the files are
for file in [0-9]*; do (( file > var )) && var=$file; done
echo $var                              # report largest

顺便说一句,如果您想保留“先列出清单”的逻辑,您仍然不应使用 ls。使用数组。

cd /wherever/your/files/are/
files=( [0-9]* )
for file in "${files[@]}"
do : ...

试试这个:

#!/bin/bash
files=`ls path/`
var=0
for file in $files
do
    echo $file
    tmp=$((file-"0"))
    if [ $tmp -gt $var ]
    then 
       var=$tmp
    fi
done

echo $var

这里有一个反引号:ls path/ 而不是单引号或双引号。 我只是更正了这个声明并且它起作用了。并注意在脚本顶部添加 #!/bin/bash 。这将告诉您的系统 运行 bash shell.

中的脚本