programing

디렉토리에 특정 파일 형식/확장자가 있는지 확인합니다.

showcode 2023. 4. 20. 23:22
반응형

디렉토리에 특정 파일 형식/확장자가 있는지 확인합니다.

bash를 사용하여 디렉토리에 특정 확장자의 파일이 있는지 여부를 어떻게 알 수 있습니까?

뭐랄까

if [ -e *.flac ]; then 
echo true; 
fi 
#!/bin/bash

count=`ls -1 *.flac 2>/dev/null | wc -l`
if [ $count != 0 ]
then 
echo true
fi 
#/bin/bash

myarray=(`find ./ -maxdepth 1 -name "*.py"`)
if [ ${#myarray[@]} -gt 0 ]; then 
    echo true 
else 
    echo false
fi

flac 파일이 존재하지 않는 경우 ls(1)가 사용되고 오류가 보고되고 스크립트가 종료됩니다.그렇지 않으면 스크립트가 속행되어 파일이 처리될 수 있습니다.

#! /bin/sh
ls *.flac  >/dev/null || exit
## Do something with flac files here
shopt -s nullglob
if [[ -n $(echo *.flac) ]]    # or [ -n "$(echo *.flac)" ]
then 
    echo true
fi
#!/bin/bash
files=$(ls /home/somedir/*.flac 2> /dev/null | wc -l)
if [ "$files" != "0" ]
then
echo "Some files exists."
else
echo "No files with that extension."
fi

어떤 깃발을 던질지 조심하셔야 합니다.if원하는 결과와 어떻게 관련되어 있는지 등을 설명합니다.

다른 유형의 파일 시스템 항목이 아닌 일반 파일만 검사하려면 코드 골격을 다음과 같이 변경해야 합니다.

if [ -f file ]; then
echo true;
fi

의 사용방법-f를 제한합니다.if일반 파일로 변환합니다만,-e는 더 광범위하고 모든 유형의 파일 시스템 엔트리와 일치합니다.물론 다음과 같은 다른 옵션도 있습니다.-d디렉토리 등좋은 리스트에 대해서는, http://tldp.org/LDP/abs/html/fto.html 를 참조해 주세요.

@msw가 지적한 바와 같이test(즉,[)는 여러 인수를 입력하려고 하면 질식합니다.이 일은 당신의 경우에 일어날 수 있습니다 만약 지구본이*.flac두 개 이상의 파일을 반환했습니다.그런 경우에는 포장해 보세요.if다음과 같은 루프로 테스트합니다.

for file in ./*.pdf
do
    if [ -f "${file}" ]; then
    echo 'true';
    break
    fi
done

이쪽입니다break원하는 파일 확장자의 첫 번째 인스턴스에서 스크립트의 나머지 부분을 계속 사용할 수 있습니다.

최고의 솔루션(if [ -e *.flac ];)효과가 없었습니다.다음 사항을 제시하겠습니다.[: too many arguments

if ls *.flac >/dev/null 2>&1;효과가 있을 거야

-f를 사용하여 특정 유형의 파일이 있는지 확인할 수 있습니다.

#!/bin/bash

if [ -f *.flac ] ; then
   echo true
fi 

bash만:

any_with_ext () ( 
    ext="$1"
    any=false
    shopt -s nullglob
    for f in *."$ext"; do
        any=true
        break
    done
    echo $any 
)

if $( any_with_ext flac ); then
    echo "have some flac"
else 
    echo "dir is flac-free"
fi

서브셸이 사용되고 있는지 확인하기 위해 괄호 대신 괄호를 사용합니다(현재 사용하고 있는 것을 클로빙하지 않음).nullglob설정).

   shopt -s nullglob
   set -- $(echo *.ext)
    if [ "${#}" -gt 0 ];then
      echo "got file"
    fi

완성을 위해 zsh:

if [[ -n *.flac(#qN) ]]; then
  echo true
fi

이는 zsh 매뉴얼의 조건식 섹션 끝에 나열되어 있습니다.부터[[filename globing을 디세블로 합니다.파일명을 강제로 생성할 필요가 있습니다.(#q)글러빙 스트링의 마지막에, 그 다음에N플래그(NULL_GLOBoptions)를 지정하면 일치하는 문자열이 없을 경우 생성된 문자열이 강제로 비워집니다.

외부 명령어를 사용하지 않는 솔루션을 다음에 나타냅니다(즉, no).ls대신 셸 기능이 있습니다.bash로 테스트 완료:

shopt -s nullglob
function have_any() {
    [ $# -gt 0 ]
}

if have_any ./*.flac; then
    echo true
fi

함수have_any사용하다$#그 논거를 세고,[ $# -gt 0 ]그러면 적어도1개의 인수가 있는지 여부를 테스트합니다.「 」의 ./*.flac한 것이 *.flachave_any이렇게 , 하다, 하다, 하다, 하다, 하다 등의 .--help.

다음은 매우 간단한 솔루션입니다.

if [ "$(ls -A | grep -i \\.flac\$)" ]; then echo true; fi

보시다시피 이것은 코드 한 줄에 불과하지만 충분히 작동합니다.bash와 대시와 같은 posix 준거 셸 모두에서 동작합니다.또한 대소문자를 구분하지 않으며 어떤 파일 유형(일반, symlink, 디렉터리 등)이 존재하는지 상관하지 않습니다. 이는 symlink 등이 있는 경우에 유용할 수 있습니다.

이거 해봤어요.

if [ -f *.html ]; then
    echo "html files exist"
else
    echo "html files dont exist"
fi

다른 파일에는 문제없이 이 코드를 사용했지만 html 파일에는 오류가 발생했습니다.

[: too many arguments

그리고 나서 @Jeremy를 시도했다.위어의 카운트 해답은 나에게 효과가 있었다.

count=`ls -1 *.flac 2>/dev/null | wc -l`
if [ $count != 0 ]
then 
echo true
fi 

루프에서 이 작업을 수행할 경우 카운트를 리셋해야 합니다.

count=$((0))

이것은, 어떠한 셸에서도 동작합니다.

if [ "$(find . -maxdepth 1 -type f | grep -i '.*\.flac$')" ]; then
    echo true
fi

은 GNU의 GNU에서도 합니다.find, 의 경우 IDKfind:

if [ "$(find . -maxdepth 1 -type f -iname \*.flac)" ]; then
    echo true
fi

언급URL : https://stackoverflow.com/questions/3856747/check-whether-a-certain-file-type-extension-exists-in-directory

반응형