获取bash中最新的变量目录

Jon*_*han 30 bash

我想在目录中找到最新的子目录,并将结果保存到bash中的变量中.

像这样的东西:

ls -t /backups | head -1 > $BACKUPDIR
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

Fem*_*ref 40

BACKUPDIR=$(ls -td /backups/*/ | head -1)
Run Code Online (Sandbox Code Playgroud)

$(...) 在子shell中计算语句并返回输出.

  • 尽管被接受并被大量投票,但这个解决方案存在一些问题.如果目录中的最新项目不是目录,则它不起作用.如果最新的子目录的名称以"."开头,则它不起作用.如果最新的子目录具有包含换行符的名称,则它不起作用.[Shellcheck](http://www.shellcheck.net/)抱怨使用`ls`.请参阅[ParsingLs - Greg的Wiki](http://mywiki.wooledge.org/ParsingLs),详细解释处理`ls'输出的危险. (15认同)

Mar*_*tin 18

只有一个简单的解决方案ls:

BACKUPDIR=$(ls -td /backups/*/ | head -1)
Run Code Online (Sandbox Code Playgroud)
  • -t 按时间排序(最新的第一个)
  • -d 仅列出此文件夹中的项目
  • */ 只列出目录
  • head -1 返回第一个项目

*/直到我发现 在bash中使用ls列出目录时我才知道:检查.


pjh*_*pjh 6

这是一个纯 Bash 解决方案:

topdir=/backups
BACKUPDIR=

# Handle subdirectories beginning with '.', and empty $topdir
shopt -s dotglob nullglob

for file in "$topdir"/* ; do
    [[ -L $file || ! -d $file ]] && continue
    [[ -z $BACKUPDIR || $file -nt $BACKUPDIR ]] && BACKUPDIR=$file
done

printf 'BACKUPDIR=%q\n' "$BACKUPDIR"
Run Code Online (Sandbox Code Playgroud)

它跳过符号链接,包括指向目录的符号链接,这可能是也可能不是正确的做法。它跳过其他非目录。它处理名称包含任何字符的目录,包括换行符和前导点。