glob을 사용하여 for 루프에서 ‘./’를 지정하면 이점이 있습니까? 파일을 검색 할 때

./*.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여기 또는 ./*일반적으로 사용하는 것이 있습니까?



답변

*와일드 카드 문자에 대한 설명에서 다음과 같이 표시되므로 처음에는 놀라운 와일드 카드 동작입니다 .

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

… 파일 이름 의 문자 인 경우 마침표가 약간 특별하다는 것을 알 때까지 . 소개 텍스트는 다음과 3.5.8 Filename Expansion같이 말합니다.

파일 이름 확장에 패턴을 사용하는 경우 문자 ‘.’ 쉘 옵션 dotglob이 설정되어 있지 않으면 파일 이름의 시작 부분이나 슬래시 바로 다음에 명시 적으로 일치해야합니다.

접두사 와일드 카드 접두사의 “사용 패턴”은 스틸 드라이버가 언급 한 것처럼 bash 쉘에서 선행 대시가있는 이름./처리하는 데 유용합니다 . 와일드 카드 / 파일 이름 확장에는 영향을 미치지 않지만 파일을 참조 할 때 해당 프로그램이 옵션으로 잘못 해석 될 수있는 문자로 시작하는 경우 파일 이름을 처리하는 것이 더 안전하고 쉬워집니다. 예를 들면 다음과 같습니다.

# 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가 더 나은 이유를 참조하십시오 . 이런 이유로 그리고 다른 사람들. 다른 유틸리티는 다른 옵션에 의해 트립되므로 파일 이름을 가능한 한 안전하게 유틸리티에 제공하는 것이 좋습니다. 당신이 경우 하지 않는 파일 이름을 “탈출”에 와일드 카드를 앞에, 당신은 다른 방법으로 “보호”당신의 유틸리티해야 할 것이다; 하나의 일반적인-- 예는 다음 과 같이 옵션의 끝을 알리는 것입니다 .

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

-n파일 이름을 mv()에 안전하게 전달합니다 set -x.

mv -- -n backup/-n