현재 작업 디렉터리에서 문자 "f"가 포함된 모든 파일 이름을 검색하기 위해 다음 코드를 작성했습니다.
for i in *
do
echo $i
if [ $i = "*f*" ]
then
echo "no"
else
echo "yes"
fi
done
디렉토리에 있는 모든 파일에 대해 "f"가 포함되어 있는지 여부에 관계없이 "yes"가 인쇄됩니다. 도와주세요.
답변1
[ $i = "*f*" ]
변수에 저장된 파일 이름을 i
공백을 기준으로 별도의 단어로 나누고, 각 단어를 와일드카드 패턴으로 해석하고, 일치하는 경우 확장한 다음, 결과 단어 목록을 다음과 같이 구문 분석합니다 [ … ]
. 이 지루한 작업을 피하려면 대신 파일 이름을 사용하세요.변수 확장 주위에 큰따옴표 추가.
[ "$i" = "*f*" ]
변수의 파일 이름이 i
3글자 이름 인지 테스트합니다 *f*
. 이 이름의 파일이 없으면 모든 파일이 else 분기를 트리거하여 yes
인쇄됩니다.
ksh, bash 또는 zsh에서는 이중 대괄호 구성을 사용하여 문자열이 와일드카드 패턴과 일치하는지 테스트할 수 있습니다. 패턴의 와일드카드 문자를 따옴표 없이 그대로 둡니다.
if [[ "$i" = *f* ]]; then …
일반 sh에는 이중 괄호 구문이 없습니다. 문자열이 패턴과 일치하는지 테스트하려면 case
생성자를 사용할 수 있습니다.
case "$i" in
*f*) echo "no";;
*) echo "yes";;
esac
답변2
f
문자가 포함된 파일 만 표시하고 싶기 때문에 continue
내장된 가 필요합니다. 예를 들어
for f in *; do if [[ $f != *f* ]]; then continue; else printf '%s\n' "$f yes"; fi; done
모든 파일과 해당 파일을 표시하려면 다음을 수행해야 합니다 yes
.no
for f in *; do if [[ $f = *f* ]]; then printf '%s\n' "$f yes"; else printf '%s\n' "$f no"; fi; done
위의 방법은 디렉토리에도 적용됩니다. 따라서 디렉토리를 제외하려면 ! -d $f
다음 예를 사용할 수 있습니다.
for f in *; do if [[ $f = *f* && ! -d $f ]]; then printf '%s\n' "$f yes"; else printf '%s\n' "$f no"; fi; done
답변3
test
("test" 내장 명령과 동의어) 명령은 [
패턴 사용을 허용하지 않습니다.
STRING1 = STRING2
True if the strings are equal.
따라서 문자열을 문자별로 비교하여 파일이 존재하지 않는지 확인합니다.*f*
yes
디렉터리의 이름(따라서 이름이 일치하지 않을 때 역방향 일치 스크립트가 에코됩니다). -buitin
대신 자유롭게 사용할 수도 있습니다.test
/bin/test
배쉬 키워드 [[
When the `==' and `!=' operators are used, the string to the right of
the operator is used as a pattern and pattern matching is performed.
When the `=~' operator is used, the string to the right of the operator
is matched as a regular expression.
다음 두 가지를 모두 사용할 수 있습니다.
[[ "$i" == *f* ]]
[[ "$i" =~ f ]]
f
그러나 이름에 파일 이름이 있는 현재 디렉터리의 파일 만 인쇄하려는 경우에는 다음과 같이 하면 echo
충분합니다.
echo *f*
답변4
이것은 반복적인 연습인가요? 그렇지 않은 경우 find를 사용하는 것이 더 쉬울 수 있습니다.
search=$(find /path/to/dir -type f -name *f*)
echo $search