A variável de matriz da correspondência de diretório

2

Gostaria de verificar se um diretório contém uma matriz de extensões de arquivo. Eu estou no Ubuntu usando o Bash.

Algo como:

files=$(ls $1/*)

extensions=$( txt pdf doc docx)

if [[ -e $files[@] contains $extenstions[@] ]] && echo "document exists" || 

echo "nothing found"
    
por andrew.vh 01.01.2016 / 06:26

4 respostas

2

Tente isto:

shopt -s nullglob
files=(*.txt *.pdf *.doc *.docx)
if [[ ${#files} -eq 0 ]]; then echo "nothing found"; fi

ou

shopt -s nullglob extglob
files=(*.+(txt|pdf|doc|docx))
if [[ ${#files} -eq 0 ]]; then echo "nothing found"; fi

Se você precisar de arquivos de todos os subdiretórios também:

shopt -s nullglob extglob globstar
files=(**/*.+(txt|pdf|doc|docx))
if [[ ${#files} -eq 0 ]]; then echo "nothing found"; fi

De man bash :

nullglob: If set, bash allows patterns which match no files to expand to a null string, rather than themselves.

extglob: If set, the extended pattern matching features are enabled. See below.

globstar: If set, the pattern ** used in a pathname expansion context will match all files and zero or more directories and subdirectories.

Ampliação da globalização :

?(pattern-list): Matches zero or one occurrence of the given patterns

*(pattern-list): Matches zero or more occurrences of the given patterns

+(pattern-list): Matches one or more occurrences of the given patterns

@(pattern-list): Matches one of the given patterns

!(pattern-list): Matches anything except one of the given patterns

    
por 01.01.2016 / 08:46
-1

encontre todos os arquivos no diretório:

 #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"

Você pode fazer outras coisas assim, como quantos documentos do tipo pdf foram encontrados, ou algo assim.

Você também pode usar grep -E para gravar apenas uma expressão para contar todos os tipos de arquivos, com a condição OR (|). que reduzirá para apenas um comando.

Outra opção fácil de contar:

   numberoffiles='find -name "*.pdf" -o -name "*.doc" -o name "*.txt"'
    
por 01.01.2016 / 06:49
-1
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

Quando isso concluir, todos os arquivos estarão em $1 e $2 e etc. O grupo inteiro pode ser referenciado como uma única string como "$*" ou como uma lista de strings separadas, como "$@" . A contagem pode ser obtida em "$#" . E você pode manipular os membros da matriz arg com set (como acima) ou então com shift .

    
por 01.01.2016 / 11:05
-1

Transforme sua lista de extensões em um @(…|…) padrão de caractere curinga .

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

Como alternativa (especialmente se você quiser encontrar arquivos em subdiretórios de forma recursiva), use 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

Como alternativa, use zsh.

matches=(*.$^extensions(NY1))
if ((#matches)); then
  echo "There are matches"
fi
    
por 02.01.2016 / 03:32