如何获取正确结果?关于ls命令筛选Apache指定目录特定.conf文件的问询
解决方法:获取指定目录下以'a'开头的.conf文件名(仅文件名,无路径)
你的问题核心有两个:一是原命令里变量名和=之间加了空格(bash语法不允许),二是ls带路径执行会输出完整路径前缀。下面给你几种实用的解决办法:
方法1:先切换到目标目录再执行ls
通过子shell切换到目标目录,这样ls输出的就是纯文件名,而且不会影响当前shell的工作目录:
ANSWER=$(cd apache2/mods-available && ls -1 a*.conf)
方法2:用basename提取文件名
通过管道把ls的输出传给basename,直接去掉路径部分:
ANSWER=$(ls -1 apache2/mods-available/a*.conf | xargs basename)
如果担心文件名含空格的情况,用循环处理更稳妥:
ANSWER=$(for file in apache2/mods-available/a*.conf; do basename "$file"; done)
方法3:用bash参数扩展截取文件名
利用bash内置的参数扩展功能,不需要额外命令就能剥离路径:
ANSWER=$(for file in apache2/mods-available/a*.conf; do echo "${file##*/}"; done)
这里${file##*/}的作用是去掉变量file中从开头到最后一个/的所有内容,剩下的就是纯文件名。
方法4:用find命令(更稳健)
如果需要处理特殊文件名或者更复杂的筛选逻辑,find是更可靠的选择:
ANSWER=$(find apache2/mods-available -maxdepth 1 -type f -name 'a*.conf' -printf "%f\n")
-maxdepth 1:只搜索当前目录,不递归子目录-type f:仅匹配文件(排除同名目录)-printf "%f\n":输出纯文件名,每个占一行
额外注意点
- 变量赋值时,变量名和
=之间不能有空格!你原命令里的Answer = $(...)会触发bash语法错误,正确写法是ANSWER=$(...)。 - 如果目标目录下没有匹配的文件,
a*.conf会原样输出,可加上shopt -s nullglob让bash在无匹配时返回空:
ANSWER=$(shopt -s nullglob; cd apache2/mods-available && ls -1 a*.conf)
内容的提问来源于stack exchange,提问作者Georges Kayembe
相关产品推荐
相关产品推荐

