ProgramingTip

특정에 있는지 확인

bestdevel 2020. 11. 30. 19:23
반응형

특정에 있는지 확인


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

이 ls (1)을 (를) 사용합니다. flac 파일이 운영되고 ls는 오류를보고하고 펼쳐집니다. 확장 확장가 계속되고 파일이 처리 될 수 있습니다.

#! /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 [ -e *.flac ];)은 나를 위해 작동하지 않을 수 있습니다.[: too many arguments

if ls *.flac >/dev/null 2>&1; 작동 작동합니다.


은 당신이 당신 당신의 if진술에 어떤 깃발을 던지고 그것이 당신이 원하는 결과와 어떤 관련이 있는지주의해야 우리합니다.

다른 유형의 파일 시스템 항목이 아닌 일반 파일 만 확인 비용 코드 스켈레톤을 다음과 같이 변경해야합니다.

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

의 사용 은을 일반 파일로 -f제한하는 if반면, -e더 많은 유형의 파일 시스템 항목과 일치합니다. 물론 -d디렉토리 와 같은 다른 옵션도 있습니다 . 좋은 목록 http://tldp.org/LDP/abs/html/fto.html참조 하십시오.

@msw가 지적했듯이 test(즉 [) 두 개 이상의 인수를 제공하려고합니다. glob이 *.flac둘 이상의 파일 반환 하는 경우 귀하의 경우에 보관할 수 있습니다 . 이 경우 if테스트를 다음과 같은 루프로 래핑하십시오 .

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

이렇게 break하면 원하는 파일에서 첫 번째 인스턴스에서 나머지를 계속 사용할 수 있습니다.


   shopt -s nullglob
   set -- $(echo *.ext)
    if [ "${#}" -gt 0 ];then
      echo "got file"
    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설정 을 방해하고 싶지 않음 ).


다음은 외부 명령 (예 : no ls)을 사용하지 않고 대신 쉘 함수를 사용하는 솔루션 입니다. bash에서 테스트되었습니다.

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

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

함수 have_any$#인수를 계산하는 데 사용 하고 인수 [ $# -gt 0 ]가 하나 이상 있는지 테스트합니다. 의 사용은 ./*.flac단지 대신 *.flac에 호출은 have_any같은 이름을 가진 파일로 인한 문제를 방지하는 것입니다 --help.


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

#!/bin/bash

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

완료하려면 zsh를 사용하십시오.

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

이것은 zsh 매뉴얼 조건식 섹션 끝에 나열되어 있습니다. [[파일명 globbing을 비활성화 하기 때문에 (#q)globbing 문자열의 끝에 사용하여 파일명 생성을 강제해야 합니다. 그런 다음 N플래그 ( NULL_GLOB옵션)를 사용하여 일치하지 않는 경우 생성 된 문자열을 강제로 비워야합니다.


다음은 매우 간단한 해결책입니다.

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

보시다시피 이것은 한 줄의 코드 일 뿐이지 만 충분히 잘 작동합니다. bash 및 dash와 같은 posix 호환 쉘 모두에서 작동해야합니다. 또한 대소 문자를 구분하지 않으며 어떤 유형의 파일 (일반, 심볼릭 링크, 디렉토리 등)이 있는지 상관하지 않습니다. 심볼릭 링크 등이있는 경우 유용 할 수 있습니다.

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

반응형