Bash查找文件名并设置为变量

时间:2015-11-16 22:46:58

标签: bash

我想在服务器上的文件夹中找到文件的名称,并将其设置为变量以便稍后使用。问题是,当我运行备份脚本时,文件名每次都会更改以补偿日期。所以我不能只是硬编码文件名和路径。

例如我知道文件的位置 - /var/backups/"unknownfilename.sql“

 backuppath="/var/backups/"

如何在$ backuppath中将$ backupfile设置为文件?

在研究之后,我只能找到人们回显文件名的地方,他们永远不会将它们存储到变量中。

1 个答案:

答案 0 :(得分:2)

对于bash(#!/bin/bash):

backuppath=/var/backups
sqlfiles=( "$backuppath"/*.sql )
[[ -e $sqlfiles ]] || { echo "Matched no files" >&2; exit 1; }

如果你想参考第一场比赛:

echo "The first match found was: $sqlfiles"

如果要引用所有数组内容:

echo "Found the following files:"
printf '- %q\n' "${sqlfiles[@]}"

对于POSIX sh(#!/bin/sh)而不是:

backuppath=/var/backups

# wrap in a function to avoid overwriting the global $1, $2, etc.
find_files() {
  set -- "$backuppath"/*.sql
  [ -e "$1" ] || { echo "Matched no files" >&2; exit 1; }
  [ "$#" -gt 1 ] && echo "WARNING: Matched $# files; only taking first" >&2
  sqlfile=$1
}
find_files

注意事项:

  • 扩展本身("$backuppath")应该在引号内; glob表达式(*.sql)不应该。
  • 测试是否存在找到的第一个元素(bash中的[[ -e $sqlfiles ]],POSIX sh版本中的[ -e "$1" ])可防止在不存在匹配时的默认行为,这将使用glob表达式本身({{1 }}) 结果是;当测试存在时,除非文件存在字面上的名称(也就是说,包含星号的名称),否则这将不存在。
  • 第一个表单使用bash中存在的两个行为(标记了您的问题的shell),但不是/var/backups/*.sql:数组和扩展(/bin/sh)测试运算符。如果您要使用标准测试命令,那么它将是[[ ]];如果你在没有数组的shell中操作,你可以将这个逻辑包装在一个函数中并使用[ -e "$sqlfiles" ]将结果放入类似数组的对象set -- "$backuppath"/*.sql中,之后你可以引用第一个匹配作为"$@",或完整的匹配项"$1"