특정 디렉터리의 모든 *.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/'

얼마나 입력하고 싶은지에 따라 다릅니다.

관련 정보