识别名称为目录中最大数字的文件夹
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.
中的脚本
有一个目录包含以数字命名的文件夹,我必须在该目录中找到编号最大的文件夹。 这是我为查找该文件夹而编写的脚本:
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.