usando AND lógico dentro da instrução IF para procurar o arquivo ext (til ~)

0

Por favor, encontre o script abaixo:

#!/bin/bash
for index in 'ls -1 /appdata/frozen_files'
do
 for bucket in 'find /appdata/frozen_files/$index -name "*.gpg~" | cut -d/ -f4-5'
   do
    for files in 'ls /appdata/frozen_files/$bucket/rawdata | wc -l'
     do
      if [[ ' "$files" -eq 1 && "file extension = .gpg~" ' ]];
       then
        echo $bucket >> /tmp/NAS_buckets_with_less_than_2_files.txt
      fi
     done
   done
 done

pretendo: estou tentando encontrar a extensão do arquivo = .gpg ~ terminando com o til (~). nome do arquivo exemplo = journal.gz.gpg ~ .. Os arquivos .gpg estão disponíveis em / appdata / frozen_files / $ bucket / rawdata | wc -l

podemos criar uma variável que contenha a extensão do arquivo, olhando para o sistema tem algo para compará-lo.

"algo" que pode verificar a extensão do arquivo (.gpg ~)

    
por Gerald Johnson 23.05.2018 / 17:50

1 resposta

0

Não sei se entendi o que você está tentando fazer.

Isso imprimirá todos os diretórios com o nome rawdata de dentro de /appdata/frozen_files/ que contêm menos de dois arquivos com nomes terminando com .gpg~ (arquivos nos subdiretórios de rawdata não contam):

find /appdata/frozen_files/ -type d -name "rawdata" -exec \
   sh -c '
      cd "$1" || exit 1
      num=$(find . ! -name . -prune -type f -name "*.gpg~" -exec printf "\n" \; | wc -l)
      [ "$num" -lt 2 ]
   ' sh {} \
\; -print

O procedimento é:

  1. O% externo find encontra todos os diretórios rawdata .
  2. Para cada diretório, sh é chamado; o diretório está disponível como "$1" dentro do comando fornecido.
  3. Este shell cd -s para o diretório e executa o interior find .
  4. Este find imprime uma nova linha para cada arquivo *.gpg~ diretamente no diretório.
  5. Essas novas linhas são contadas por wc .
  6. O resultado (número) é armazenado como num variable.
  7. O resultado é testado se for menor que 2 .
  8. Se o teste for bem-sucedido, o% outer find imprime o diretório.

Notas:

  • Poucas soluções estão presentes devido à portabilidade e à conformidade com POSIX:
    • ! -name . -prune em vez de -maxdepth 1 ,
    • -exec printf "\n" \; em vez de -printf "\n" .
  • A variável é usada para que possa ser reutilizada, por exemplo:

    [ \( "$num" -gt 2 \) -a \( "$num" -lt 10 \) ]
    
  • Use -print0 em vez de -print se precisar analisar a saída de maneira segura.

  • Analise a saída ou modifique o comando para extrair apenas uma parte de cada caminho obtido; por exemplo. em vez de -print você pode querer usar:

    -exec sh -c 'basename "$(dirname "$1")"' sh {} \;
    

    para obter o diretório pai de cada rawdata que corresponde aos critérios.

por 13.06.2018 / 10:34