目录是否匹配数组变量

目录是否匹配数组变量

我想检查目录是否包含文件扩展名数组。我在 Ubuntu 上使用 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:如果设置,路径名扩展上下文中使用的模式 ** 将匹配所有文件以及零个或多个目录和子目录。

扩展通配符:

?(pattern-list):匹配零次或一次出现的给定模式

*(pattern-list):匹配给定模式的零次或多次出现

+(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 -EOR (|) 条件仅编写一个表达式来计算所有类型的文件。这将减少到只有一个命令。

另一个简单的计数选项:

   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 (如上)否则w/ 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

相关内容