在 shell 脚本中通过 if 条件搜索具有相似名称的文件

search for files with similar names by if condition in shell script

我正在尝试使用 shell 脚本中的 if 条件来检查工作目录中是否存在某些文件(以相似的名称开头)。 我的问题是我有多个文件即。 "A1.txt"、"A2.txt"、"A3.txt" 等在我的工作目录中。 现在我的问题是,有没有办法用文件名的字符串部分检查文件。因此,如果脚本至少找到一个文件名以 "A" 开头的文件,那么它会打印找到的文件,即没有文件名以 "A" 开头的文件,它不会打印出来。 我的尝试如下:

if [ -f "A*.txt" ];
then
echo "Files exist."
else
echo "Files do not exist"
fi

但它不起作用 returns "too many arguments"。有出路吗?

这可能是一种方式:

#!/bin/bash

check=`ls A*.txt 2> /dev/null`

if [ ! -z "${check}" ];
then
echo "Files exist."
else
echo "Files do not exist"
fi

然后如果需要,您可以使用正则表达式改进 check 变量,即只获取带有编号的文件,您可以执行类似 check=ls A[1-9]*.txt

的操作

此致

克劳迪奥

在BASH中你可以使用:

( shopt -s nullglob; set -- A*.txt; (( $# > 0 )) ) &&
    echo "Files exist." || echo "Files don't exist"

当它找到匹配的文件时,它将退出并显示 0 并打印:

Files exist.

当它找不到任何与给定的 glob 模式匹配的 file/directory 时,它将退出并显示 1 并打印:

Files don't exist

解释:

  • shopt -s nullglob 如果 glob
  • 没有匹配的文件,则 shell 会自动失败
  • set -- 将给定参数分配给位置参数 ,,
  • $# 是位置参数的数量。如果找到任何匹配文件,它将被设置为大于零
  • ((...))用于bash
  • 中的算术求值
  • (..) 为上面的命令创建一个子shell,这样当前shell的环境就不会受到影响