for 루프에서 './'를 지정하기 위해 glob을 사용하면 어떤 이점이 있습니까?

for 루프에서 './'를 지정하기 위해 glob을 사용하면 어떤 이점이 있습니까?

예를 들어 . ./*.fastq를 검색하면 파일이 캡처되지 않는 것 같습니다 . 다음 예에서 볼 수 있듯이 이는 분명히 잘못된 것입니다..fastq./.fastq

TMP_DIR=$(mktemp --directory)
mkdir -p ${TMP_DIR}
(cd ${TMP_DIR}
 touch {a,b,c,}.fastq
 ls -a
 echo ""

 echo "# match all:"
 for f in *.fastq ; do
     echo "${f}"
 done
 echo ""

 echo "# with ./:"
 for f in ./*.fastq ; do
     echo "${f}"
 done
)
rm -rf ${TMP_DIR}
.
..
a.fastq
b.fastq
c.fastq
.fastq

# match all:
a.fastq
b.fastq
c.fastq

# with ./:
./a.fastq
./b.fastq
./c.fastq

파일 과 일치하지도 일치 *.fastq하지도 않습니다 . 이제 여기서 또는 일반적으로 사용하는 데 어떤 의미가 있는지 궁금합니다../*.fastq.fastq./*.fastq./*

답변1

*와일드카드는 다음과 같이 설명되므로 처음에는 놀라운 와일드카드 동작입니다.

빈 문자열을 포함하여 모든 문자열과 일치합니다.

...그 시대에 뭔가 특별한 것이 있었다는 것을 깨닫기 전까지는첫 번째파일 이름의 문자. 소개 텍스트는 다음과 3.5.8 Filename Expansion같습니다.

파일 이름 확장에 패턴이 사용되는 경우 쉘 옵션 dotglob이 설정되지 않은 한 파일 이름 시작 부분이나 슬래시 바로 뒤의 "." 문자가 명시적으로 일치해야 합니다.

./다음에 대한 와일드카드 접두사 "사용 패턴"Bash 쉘에서 대시로 시작하는 이름 처리, Steeldriver가 언급했듯이. 와일드카드/파일 이름 확장에는 영향을 미치지 않지만 프로그램이 옵션으로 잘못 해석할 수 있는 문자로 시작하는 경우 파일 이름을 인용할 때 파일 이름을 처리하는 것이 더 안전하고 더 쉽습니다. 예를 들어:

# I want a file named `-n`
$ touch -n
touch: invalid option -- 'n'
Try 'touch --help' for more information.
$ touch -- -n
### ok
$ touch ./-n
### ok

...지금 나는가지다-n와일드카드를 사용하여 반복하는 경우 이름이 파일 인 경우:

for file in *n
do
  echo "$file"
done

...아무런 결과도 나오지 않습니다!

./하지만 와일드카드 앞에 을 추가 하면

for file in ./*n
do
  echo "$file"
done
./-n

...파일명이 보입니다.

다음은 데모 목적을 위한 간단한 예입니다.왜 printf가 echo보다 나은가요?이것과 다른 이유 때문입니다. 다른 유틸리티는 다른 옵션에 의해 작동되지 않으므로 최대한 안전하게 유틸리티에 파일 이름을 제공하는 것이 가장 좋습니다. 만약 너라면아니요파일 이름을 "이스케이프"하기 위한 접두사로 와일드카드를 사용하려면 다른 방법으로 유틸리티를 "보호"해야 합니다.흔한하나는 option 으로 끝나는 것입니다 --. 예를 들면 다음과 같습니다.

for file in *n
do
  mv -- "$file" backup/"$file"
done

... 아래 그림과 같이 -n파일 이름을 안전하게 전달합니다 .mvset -x

mv -- -n backup/-n

관련 정보