在bash中列出特定模式的文件

在bash中列出特定模式的文件,bash,shell,cmd,Bash,Shell,Cmd,在这种情况下,我必须列出类型为 数据库名。schemaName@1234sdf2323.lock其中(数据库)名称和(目标)模式(模式)名称 _lockFolder是变量 @是一个标记,其后是随机字母数字,结尾是.lock 我已经通过以下代码在批处理文件中实现了这一点 FOR /R %_lockFolder% %%F in (%_Database_Name%.%_target_schema_name%@*.lock) do ( for /f "tokens=1* delims=@ "

在这种情况下,我必须列出类型为

数据库名。schemaName@1234sdf2323.lock其中(数据库)名称和(目标)模式(模式)名称 _lockFolder是变量

@是一个标记,其后是随机字母数字,结尾是.lock

我已经通过以下代码在批处理文件中实现了这一点

FOR /R %_lockFolder% %%F in (%_Database_Name%.%_target_schema_name%@*.lock) do (
    for /f "tokens=1*  delims=@  " %%G IN ("%%~nF") DO ( 
        SET _no=%%H 
        )
)  
但是当我把它改成bash environment以便它可以在unix environment上运行时

for entry in "${_lockFolder}"/*
do
  echo ENTRY "$entry"

name='${_lockFolder}/${_Database_Name}.${_target_schema_name}@*.lock'

ls -l $name > "${lockFolder}"

if [ "$?" -eq "0" ]
then
     echo "Do your work here"
else
     echo "No files are there for the given pattern"
fi  


#   exit 21 

done 

它无法识别模式。这些文件存在于我指定的文件夹中

您可以简单地编写一个for循环

for file in `find ${lockdir} -name "^${_lockFolder}/${_Database_Name}.${_target_schema_name}@*.lock$"`
do 
echo $file 
:
:
your job

done
例如

[root@giam20 unix]# ls
checksumupdator.sh                 GIAMMEFProcessor.sh                         GIAMRoleExtractor.sh
GIAMAccountExtractor.sh            GIAMMetaDataLoader.sh                       GIAMRoleLoader.sh
GIAMAccountLoader.sh               GIAMOOPControlledAttrExtractor.sh           GIAMRoleMappingLoader.sh
GIAMAccountTransferLoader.sh       GIAMOOPControlledAttrsLoader.sh             
 [root@giam20 unix]# find . -name "GIAM*.sh"
        ./GIAMAccountTransferLoader.sh
        ./GIAMIntermediateCodeUpgrader.sh
        ./GIAMServiceUpdator.sh
        ./GIAMOOPControlledAttrsUpdator.sh
        ./GIAMRoleUpdator.sh
        ./GIAMProvisioningPolicyExtractor.sh
        ./GIAMCompExemptionExtractor.sh
        ./GIAMApprovalNotificationLoader.sh

在unixshell脚本中,变量引用不会解析为包含在单引号中的字符串。因此,在这方面,

name='${_lockFolder}/${_Database_Name}.${_target_schema_name}@*.lock'
该值将按字面形式存储到name中,包括所有${name}引用。因此,这种模式后来不匹配也就不足为奇了

因此,只需将单引号更改为双引号:

name="${_lockFolder}/${_Database_Name}.${_target_schema_name}@*.lock"

新代码的用途似乎与原始代码相冲突。您不应该在${u Database\u Name}.${u target\u schema\u Name}中填充.lock文件吗?不,目的与${u Database\u Name}.${u target\u schema\u Name}@some\u random\u number.lock文件相同,可在${lockFolder}中找到但是,正如您的回答所述,更改后同样不起作用。您是否尝试在循环中回显$name,以便查看它得到的值?