Bash 脚本:使用通配符

Bash 脚本:使用通配符

我有两个不同的文件夹。

第一个包含以我的服务器名称命名的符号链接(例如:udcedpai101)。第二个包含我的服务器的清单,其中的文件以服务器名称开头并以不同的模式结尾。(这就是我使用通配符的原因)

清单文件名始终以服务器名称开头(例如:udcedpai101-print_manifest.txtlegpspai101-print_inventaire.txt、legpspai101.myhome.qc.ca-print_inventaire.txt)。但它们的结尾可以不同。

这是我正在运行的命令:

for i in `ls -l /etc/domain.conf | grep ^l | awk {'print $9'}`*; do
 ls -l "/var/opt/apache/htdocs/support/print_manifest/$i*"; 
done 

(部分)输出...

> /usr/local/coreutils/bin/ls: cannot access
> /var/opt/apache/htdocs/support/print_manifest/udcedcgi101*: No such file or directory /usr/local/coreutils/bin/ls: cannot access
> /var/opt/apache/htdocs/support/print_manifest/udcedcgi102*: No such file or directory /usr/local/coreutils/bin/ls: cannot access
> /var/opt/apache/htdocs/support/print_manifest/udcedcgi103*: No such file or directory

我尝试在命令中使用通配符 (*),但它总是返回一个错误,指出文件不存在,但即使文件存在,我也可以查看该文件:

ls -l /var/opt/apache/htdocs/support/print_manifest/udcedcgi103*
-rw-r----- 1 TOTO TOTO 69455 Mar  9 00:00 /var/opt/apache/htdocs/support/print_manifest/udcedcgi103-print_manifest.txt

非常感谢您的帮助!

答案1

您不应该解析来自ls. 相反,请尝试以下操作:

for i in /etc/domain.conf/*; do
    test -L "$i" || continue  # skip if not a symlink
    ls -l "/var/opt/apache/htdocs/support/print_manifest/${i%%*/}"* 
done

第二个问题是星号在双引号中,因此 shell 查找的是udcedcgi101*字面意思,而不是要扩展的通配符。

仅检索${i%%*/}文件的基本名称,因为循环现在迭代完整路径名而不是内的相对路径/etc/domain.conf/

答案2

您需要将ls循环中的第二个引号移到*

改变

ls -l "/var/opt/apache/htdocs/support/print_manifest/$i*"; 

ls -l "/var/opt/apache/htdocs/support/print_manifest/$i"*; 

你可能根本不需要引号。*双引号内有引号会阻止其扩展。

相关内容