我想检查目录是否包含文件扩展名数组。我在 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 -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
(如上)否则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