Bash 스크립트를 사용하여 디렉토리에서 파일 검색

Bash 스크립트를 사용하여 디렉토리에서 파일 검색

현재 작업 디렉터리에서 문자 "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*" ]변수의 파일 이름이 i3글자 이름 인지 테스트합니다 *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

관련 정보