特定のディレクトリ内のすべての* .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/'

どのくらい入力したいかによって異なります。

関連情報