Shell脚本:按字母顺序获取文件夹中最后一个文件的名称

yan*_*yan 14 shell

我有一个文件夹,其中包含自动创建的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)

  • 就像您通常使用“ls”一样,例如“ls -1 /home/xy/abc/*.gz”。 (2认同)

jus*_*ody 7

@ Sjoerd的回答是正确的,我会从中挑选一些尼特:

  1. -1如果在某处输出输出,则不需要为每行强制执行一个路径的选项:

    ls | tail -n 1
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您可以使用-r相反的顺序获取列表,并采取第一个:

    ls -r | head -n 1
    
    Run Code Online (Sandbox Code Playgroud)
  3. gunzip some.log.gz将未压缩的数据写入some.log和删除some.log.gz,这可能是也可能不是你想要的(可能不是).如果要保留压缩源,请将其输入gunzip:

    gunzip < some.file.gz
    
    Run Code Online (Sandbox Code Playgroud)
  4. 你可能希望保护脚本不受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)


Mar*_*k H 5

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