我有一个文件夹,其中包含自动创建的MySQL数据库备份.它们的名称由备份的日期组成,如下所示:
2010-06-12_19-45-05.mysql.gz
2010-06-14_19-45-05.mysql.gz
2010-06-18_19-45-05.mysql.gz
2010-07-01_19-45-05.mysql.gz
Run Code Online (Sandbox Code Playgroud)
什么是获取列表中最后一个文件的文件名的方法,即按字母顺序排在最后的文件的文件名?
在shell脚本中,我想做类似的事情
LAST_BACKUP_FILE= ???
gunzip $LAST_BACKUP_FILE;
Run Code Online (Sandbox Code Playgroud)
Sjo*_*erd 18
ls -1 | tail -n 1
Run Code Online (Sandbox Code Playgroud)
如果要将其分配给变量,请使用$(...)或反引号.
FILE=`ls -1 | tail -n 1`
FILE=$(ls -1 | tail -n 1)
Run Code Online (Sandbox Code Playgroud)
@ Sjoerd的回答是正确的,我会从中挑选一些尼特:
-1如果在某处输出输出,则不需要为每行强制执行一个路径的选项:
ls | tail -n 1
Run Code Online (Sandbox Code Playgroud)您可以使用-r相反的顺序获取列表,并采取第一个:
ls -r | head -n 1
Run Code Online (Sandbox Code Playgroud)gunzip some.log.gz将未压缩的数据写入some.log和删除some.log.gz,这可能是也可能不是你想要的(可能不是).如果要保留压缩源,请将其输入gunzip:
gunzip < some.file.gz
Run Code Online (Sandbox Code Playgroud)你可能希望保护脚本不受dir不包含文件的情况的影响
gunzip $empty_variable
Run Code Online (Sandbox Code Playgroud)扩展到公正
gunzip
Run Code Online (Sandbox Code Playgroud)
并且这样的调用将无限期地等待标准输入的数据:
latest="$(ls -r /some/where/*.gz | head -1)"
if test -z "$latest"; then
# there's no logs yet, bail out
exit
fi
gunzip < $latest
Run Code Online (Sandbox Code Playgroud)
ls如果文件名包含不寻常的字符,则在被其他命令解析时可能会产生意外的结果。以下内容始终有效:
for LAST_BACKUP_FILE in *; do : ; done
Run Code Online (Sandbox Code Playgroud)
for LAST_BACKUP_FILE in * 依次遍历当前目录中的每个文件名,并将每个文件名存储在 $LAST_BACKUP_FILE
do : 什么也没做
done 在最后一个文件之后完成
现在,最后一个文件存储在中$LAST_BACKUP_FILE。
如果您碰巧想要第一个文件,请使用以下命令:
for FIRST_BACKUP_FILE in *; do break; done
Run Code Online (Sandbox Code Playgroud)
break在第一个文件存储在中后,该语句跳出循环$FIRST_BACKUPT_FILE。