디렉토리에 특정 파일 형식/확장자가 있는지 확인합니다.
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_GLOB
options)를 지정하면 일치하는 문자열이 없을 경우 생성된 문자열이 강제로 비워집니다.
외부 명령어를 사용하지 않는 솔루션을 다음에 나타냅니다(즉, 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
한 것이 *.flac
의 have_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
'programing' 카테고리의 다른 글
날짜 필드를 Excel 텍스트로 변환 (0) | 2023.04.20 |
---|---|
ASP를 사용하는 jQuery UI 대화상자.NET 버튼 포스트백 (0) | 2023.04.20 |
ASP.NET "특수" 태그 (0) | 2023.04.20 |
기다림과 수면의 차이 (0) | 2023.04.20 |
WPF: DockPanel에서 중간 아이를 스트레칭하려면 어떻게 해야 하나요? (0) | 2023.04.20 |