ecoa todos os nomes de arquivos * .tex em um diretório específico

2

Eu tenho uma estrutura de diretórios como esta:

├── 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~

Eu quero realizar algumas ações em titlePage.tex e lebenslauf.tex . Para isso, quero imprimir o caminho relativo de sua localização:

resultado desejado:

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

Isso significa que quero que o caminho thirdPage/ seja completamente ignorado. Portanto, acho que esta questão não é útil para minha finalidades. Além disso, estou curioso para saber o que causa o problema no meu script, por isso não quero ter uma solução usando, por exemplo, encontrar.

Eu escrevi o seguinte script para essa finalidade:

#!/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

Que imprime apenas nada. Eu brinquei com algumas variantes disso, mas nada funciona. Esta é, na minha opinião, o "melhor" resultado do que consegui até agora.

    
por toogley 12.05.2016 / 17:32

3 respostas

2

*.tex é um padrão, não uma expressão regular. Para corresponder a um padrão, não use o operador =~ .

Além disso, o seu loop itera sobre os diretórios, não sobre os arquivos dentro deles.

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

A menos que você precise atuar em cada diretório como um todo, você pode fazer um único loop para enumerar todos os arquivos. Ative os padrões estendidos do estilo ksh para obter os padrões.

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

N.B. Sempre use aspas duplas em torno da variável substituições .

    
por 13.05.2016 / 01:32
-1

muito mais simples seria provavelmente:

ls */file1.tex */file2.tex

ou

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

ou

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

dependendo de quanto você deseja digitar ...

    
por 12.05.2016 / 18:02