로 ./*.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