如何遍历匹配变量的文件并仅在bash中显示文件名?

时间:2016-03-20 12:21:17

标签: bash

我需要遍历匹配查询的所有文件并显示文件名。

目前我只能让它适用于所有文件

for filename in ~/notes/*
do
  NAME=`basename "$filename"`
  echo ${NAME%.*}
done;

删除完整路径和文件扩展名,回显文件名。

我需要相同的东西,但对于在文件名中包含查询的文件。我试过这个并没有回复任何东西

for filename in ~/notes/\*$*\* 
do
    TEST=`basename "$filename"`
    echo ${TEST%.*}
done;

如果我echo $filename确实返回完整路径,但这不是我需要的。

此外,第二个片段不会在新行中返回每个文件

我怎样才能使这个工作?

我有一个文本文件列表,例如:

  1. 文本文件酮
  2. 另一个文件名称
  3. 文本名称文件
  4. 终端中的

    我想输入myfunc name file并获取第二和第三个文件。

    我尝试了以下功能,但它只按顺序搜索。

    myfunc(){
         for filename in ~/notes/\*$*\* 
           do
             TEST=`basename "$filename"`
             echo ${TEST%.*}
           done;    
    }
    

    如果我运行myfunc file-name但不运行myfunc file name

    ,它会起作用

1 个答案:

答案 0 :(得分:1)

我已经嵌套了 if 循环,该循环在 for 循环中使用了正则表达式。

我保留了原始文件名,包括扩展名为“文件”变量,以防您希望按扩展程序进行过滤。

只需编辑正则表达式变量即可捕获不同类型的内容。

更新:已编辑,可以从命令行中获取两个参数,并且必须匹配两者才能打印文件名

    #!/usr/bin/bash

    regex=$1
    regex2=$2

    for filename in ~/notes/*; do
        file=`basename "$filename"`
        filestrip=${file%.*}

        if [[ $filestrip =~ $regex ]] && [[ $filestrip =~ $regex2 ]]; then
            echo $filestrip
        fi

    done