我有一个这样的目录结构:
├── 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/'
取决于您想输入多少内容...