次のディレクトリ構造があります。
├── 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/'
どのくらい入力したいかによって異なります。