回显特定目录中的所有 *.tex 文件名

回显特定目录中的所有 *.tex 文件名

我有一个这样的目录结构:

├── lebenslauf
│   ├── lebenslauf.out
│   └── lebenslauf.tex
├── thirdPage
│   ├── auto
│   │   ├── test.el
│   │   └── thirdPage.el
│   ├── missfont.log
│   ├── thirdPage.aux
│   ├── thirdPage.log
│   ├── thirdPage.pdf
│   └── thirdPage.tex
└── titlePage
    ├── titlePage.aux
    ├── titlePage.fdb_latexmk
    ├── titlePage.fls
    ├── titlePage.log
    ├── titlePage.pdf
    ├── titlePage.tex
    └── titlePage.tex~

我想对titlePage.tex和执行一些操作lebenslauf.tex。为此,我想打印出其位置的相对路径:

期望的结果:

$ ./script
lebenslauf/lebenslauf.tex
titlePage/titlePage.tex

这意味着,我想thirdPage/完全忽略该路径。因此,我认为这个问题对我的目的没有帮助。此外,我很好奇是什么导致了我的脚本中的问题,所以我不想使用例如 find 来解决问题。

为此,我编写了以下脚本:

#!/usr/bin/env bash
IFS=$'\n\t'
set -euo pipefail

d=( lebenslauf titlePage )
for file in "./${d[@]}"
do
    if [[  $file =~ *.tex  ]]
    then
        echo $file
    fi
done

它什么也打印不出来。我摆弄了一些变体,但没有任何作用。在我看来,这是我迄今为止所取得的“最好”结果。

答案1

*.tex是一个模式,而不是正则表达式。要匹配模式,请勿使用=~运算符。

此外,您的循环会迭代目录,而不是目录中的文件。

d=( lebenslauf titlePage )
for dir in "${d[@]}" ; do
    for file in "$dir"/*.tex ; do
        echo $file
    done
done

答案2

除非您需要将每个目录作为一个整体进行操作,否则您可以创建一个循环来枚举所有文件。激活 ksh 风格扩展模式获得或模式。

shopt -s extglob
for file in @(lebenslauf|titlePage)/*.tex; do
  echo "$file"
done

注意始终在变量替换周围使用双引号

答案3

更简单的可能是:

ls */file1.tex */file2.tex

或者

ls */*.tex | egrep '/(file1|file2).tex'

或者

ls */*.tex | grep -v 'thirdPage/'

取决于您想输入多少内容...

相关内容