특정 확장자를 가진 하나 이상의 파일이 존재하는지 확인하는 쉘 스크립트는 무엇입니까?

특정 확장자를 가진 하나 이상의 파일이 존재하는지 확인하는 쉘 스크립트는 무엇입니까?

특정 확장자를 가진 파일을 찾는 스크립트를 작성하고 싶습니다. 나는 이 일을 많이 해왔습니다:

#!/bin/bash
file="/home/Savio/Dsktop/check/*.csv"
file1="/home/Savio/check/*.txt"
if [[ -f "$file" && -f "$file1" ]];
then
    echo " found."
else
    echo "not found."
fi

폴더 에는 check하위 폴더가 포함되어 있습니다. 잘못된 점이 있으면 정정해 주시기 바랍니다.

답변1

재발하고 싶지 않다면 이렇게 하세요

export DIR=/home/Savio/Dsktop/check
if ls ${DIR}/*.txt &>/dev/null && ls ${DIR}/*.csv &>/dev/null
then
    echo "Found."
else
    echo "Not found."
fi

또는 perl:

perl -e '
    $DIR="/home/Savio/Dsktop/check";
    @a= glob "${DIR}/*.txt";
    @b= glob "${DIR}/*.csv"; 
    print  @a && @b ? "Found.\n" : "Not found.\n"
' 

만약 너라면하다재귀를 원하면 다른 답변에서 제안된 솔루션이 작동합니다. find첫 번째 일치 항목을 찾은 후 중지하면 더 빠르게 실행 되도록 할 수 있습니다 .

export DIR=/home/Savio/Dsktop/check
CSV=$(find "$DIR" -name *.csv|head -n1)
TXT=$(find "$DIR" -name *.txt|head -n1)
[ ! -z "$CSV" ] && [ ! -z "$TXT" ] && echo Found || echo Not found

인용하다

답변2

bash 스크립트는 csv 파일이 있는지 확인하고 파일이 있으면 모든 파일을 반복합니다.

#!/bin/bash
# count variable to check if csv files exists in current directory
count_file=`ls -1 *.flac 2>/dev/null | wc -l`
if [ $count_file != 0 ]
then 
  for file in *.csv; do
    echo ${file##*/}
  done
fi 

답변3

in 의 와일드카드 file1는 항상 따옴표로 묶여 있으므로 확장되지 않습니다.

Bash에서 한 가지 방법은 설정하는 것입니다nullglob옵션이렇게 하면 파일과 일치하지 않는 와일드카드가 빈 목록으로 확장됩니다.

#!/bin/bash
shopt -s nullglob
csv_files=(/home/Savio/Dsktop/check/*.csv)
txt_files=(/home/Savio/check/*.txt)
if ((${#csv_files[@]} && ${#txt_files[@]}))
then
  echo " found."
else
  echo "not found."
fi

dotglob도트 파일도 일치시키려면 이 옵션을 설정하십시오 .

POSIX 셸만 사용하면 일치하는 항목이 없을 경우 변경되지 않고 남아 있는 패턴을 처리해야 합니다.

matches_exist () {
  [ $# -gt 1 ] || [ -e "$1" ]
}
if matches_exist /home/Savio/Dsktop/check/*.csv &&
   matches_exist /home/Savio/check/*.txt; then
  echo " found."
else
  echo "not found."
fi

[[ -f file ]]파일이 존재하는지 확인할 때 파일 유형(일반, 디렉토리, 심볼릭 링크, 장치, 파이프...)에 관계없이 파일을 찾습니다.그리고정기적인파일 또는 일반 파일(디렉토리, 장치 등이 아닌)에 대한 심볼릭 링크입니다.

답변4

if [[ -f "$file" ]]여러 파일 이름이 포함된 경우 이 작업 이 실패합니다 $file. 이는 와일드카드를 사용하여 파일을 선택할 때 발생할 가능성이 높습니다.

와일드카드 없이 특정 파일 이름을 확인하거나 Petey T의 방법을 사용하여 찾은 파일 수가 find0보다 큰지 확인해야 합니다.

csv=$(find /home/Savio/Dsktop/check -type f -name "*.csv")
txt=$(find /home/Savio/check/ -type f -name "*.txt")
if [[ ( -n $csv ) -a ( -n $txt ) ]]
then
    echo "found"
else
    echo "not found"
fi

관련 정보