다음과 같은 디렉토리 구조가 있습니다.
├── 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/'
얼마나 입력하고 싶은지에 따라 다릅니다.