특정에 있는지 확인
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 호환 쉘 모두에서 작동해야합니다. 또한 대소 문자를 구분하지 않으며 어떤 유형의 파일 (일반, 심볼릭 링크, 디렉토리 등)이 있는지 상관하지 않습니다. 심볼릭 링크 등이있는 경우 유용 할 수 있습니다.
'ProgramingTip' 카테고리의 다른 글
비재 귀적 make에 대한 경험은 무엇입니까? (0) | 2020.11.30 |
---|---|
OOCalc에서 CONCATENATE 함수로 견적을 인용하는 방법 (0) | 2020.11.30 |
IMG 태그와 함께 스프라이트를 사용하십니까? (0) | 2020.11.30 |
보기 컨트롤러의보기에 사용자 지정 하위보기 (xib에서 생성됨) 추가-내가 뭘 잘못하고 있니? (0) | 2020.11.30 |
셸에서 여러 파일 이름 많이 (0) | 2020.11.30 |