디렉토리에 파일 확장자 배열이 포함되어 있는지 확인하고 싶습니다. 우분투에서 Bash를 사용하고 있습니다.
그것은 다음과 같습니다:
files=$(ls $1/*)
extensions=$( txt pdf doc docx)
if [[ -e $files[@] contains $extenstions[@] ]] && echo "document exists" ||
echo "nothing found"
답변1
이 시도:
shopt -s nullglob
files=(*.txt *.pdf *.doc *.docx)
if [[ ${#files} -eq 0 ]]; then echo "nothing found"; fi
또는
shopt -s nullglob extglob
files=(*.+(txt|pdf|doc|docx))
if [[ ${#files} -eq 0 ]]; then echo "nothing found"; fi
모든 하위 디렉터리에도 파일이 필요한 경우:
shopt -s nullglob extglob globstar
files=(**/*.+(txt|pdf|doc|docx))
if [[ ${#files} -eq 0 ]]; then echo "nothing found"; fi
에서 man bash
:
nullglob
: 설정된 경우 bash는 파일과 일치하지 않는 패턴이 자신이 아닌 빈 문자열로 확장되도록 허용합니다.
extglob
: 설정하면 확장된 패턴 일치 기능이 활성화됩니다. 아래를 참조하세요.
globstar
: 설정된 경우 경로 이름 확장 컨텍스트에 사용된 패턴 **은 모든 파일과 0개 이상의 디렉터리 및 하위 디렉터리와 일치합니다.
?(pattern-list)
: 주어진 패턴이 0개 또는 1개 발생하는 것과 일치합니다.
*(pattern-list)
: 주어진 패턴의 0개 이상의 발생과 일치합니다.
+(pattern-list)
: 주어진 패턴과 하나 이상 일치합니다.
@(pattern-list)
: 주어진 패턴 중 하나와 일치합니다.
!(pattern-list)
: 주어진 패턴 중 하나를 제외한 모든 것과 일치합니다.
답변2
디렉토리에서 모든 파일을 찾으십시오.
#find all types of files
PDFS=`find . -type f | grep pdf |wc -l`
TXTS=`find . -type f | grep txt |wc -l`
DOCS=`find . -type f | grep doc |wc -l`
DOCXS=`find . -type f | grep docx |wc -l`
SUM=$(( PDFS + TXTS + DOCS + DOCXS ))
if [[ $SUM=0 ]] ; then
echo "not found"
else
echo "Some document found"
PDF 유형의 문서 수를 찾는 것과 같은 다른 유사한 작업을 수행할 수 있습니다.
grep -E
OR(|) 조건을 사용하여 하나의 표현식만 작성하여 모든 유형의 파일을 계산할 수도 있습니다 . 이렇게 하면 단 하나의 명령으로 줄어듭니다.
또 다른 간단한 계산 옵션:
numberoffiles=`find -name "*.pdf" -o -name "*.doc" -o name "*.txt"`
답변3
set -- ### init arg array
for e in txt pdf doc docx ### outer loop for convenience
do for f in ./*."$e" ### inner loop for files
do case $f in (./\*"$e") ### verify at least one match
[ -e "$f" ];; esac && ### double-verify
set "$f" "$@" ### prepend file to array
done; done ### double-done
$1
완료되면 모든 파일은 및 $2
등에 위치하게 됩니다 . 전체 그룹은 단일 문자열(예: )로 참조되거나 "$*"
별도 문자열 목록 "$@"
(예: ) 으로 참조될 수 있습니다. 에서 카운트를 얻을 수 있습니다 "$#"
. 다음을 사용하여 arg 배열 멤버를 조작할 수 있습니다.set
(위와 같이)그렇지 않으면 shift
.
답변4
확장 목록을 다음으로 전환하세요.@(…|…)
와일드카드 패턴.
shopt -s extglob nullglob
pattern='@('
for x in "${extensions[@]}"; do
x=${x//"\\"//"\\\\"}; x=${x//"?"//"\\?"}; x=${x//"*"//"\\*"}; x=${x//"["//"\\["}
pattern="$pattern$x|"
done
pattern="${pattern%\|})"
matches=(*.$pattern)
if ((${#matches[$@]})); then
echo "There are matches"
fi
또는(특히 하위 디렉터리에서 파일을 반복적으로 찾으려는 경우) find
.
name_patterns=("(")
for x in "${extensions[@]}"; do
x=${x//"\\"//"\\\\"}; x=${x//"?"//"\\?"}; x=${x//"*"//"\\*"}; x=${x//"["//"\\["}
name_patterns+=(-name "*.$x" -o)
done
name_patterns[${#name_patterns[@]}]=")"
if [ -n "$(find dir "${name_patterns[@]}" | head -n 1)" ]; then
echo "There are matches"
fi
또는 zsh를 사용하십시오.
matches=(*.$^extensions(NY1))
if ((#matches)); then
echo "There are matches"
fi