특정 확장자를 가진 파일을 찾는 스크립트를 작성하고 싶습니다. 나는 이 일을 많이 해왔습니다:
#!/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
인용하다
- Stephane Chazelas의 훌륭한 답변첫 번째 일치 후 find 명령을 어떻게 중지할 수 있나요?
답변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의 방법을 사용하여 찾은 파일 수가 find
0보다 큰지 확인해야 합니다.
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