lista o arquivo mais antigo em diretórios em um loop

2

Eu tenho um conjunto de arquivos em uma estrutura como essa;

regions
├── ap-northeast-1
│   └── sg-66497903
│       ├── sg-66497903-2017-10-03-Tue-12.39.json
│       ├── sg-66497903-2017-10-03-Tue-12.42.json
│       ├── sg-66497903-2017-10-03-Tue-12.49.json
│       ├── sg-66497903-2017-10-03-Tue-12.53.json
│       └── sg-66497903-2017-10-03-Tue-13.12.json
├── ap-northeast-2
│   └── sg-824282eb
│       ├── sg-824282eb-2017-10-03-Tue-12.39.json
│       ├── sg-824282eb-2017-10-03-Tue-12.42.json
│       ├── sg-824282eb-2017-10-03-Tue-12.49.json
│       ├── sg-824282eb-2017-10-03-Tue-12.53.json
│       └── sg-824282eb-2017-10-03-Tue-13.12.json
├── ap-south-1
│   └── sg-4fec0526
│       ├── sg-4fec0526-2017-10-03-Tue-12.39.json
│       ├── sg-4fec0526-2017-10-03-Tue-12.42.json
│       ├── sg-4fec0526-2017-10-03-Tue-12.49.json
│       ├── sg-4fec0526-2017-10-03-Tue-12.53.json
│       └── sg-4fec0526-2017-10-03-Tue-13.12.json

A lista é mais longa, mas você tem a ideia. Eu estou tentando encontrar o arquivo json mais antigo em cada diretório para usar como no padrão para definir em uma matriz e diff os outros arquivos nos diretórios individuais.

Eu tenho isso até agora, mas não está certo.

#!/bin/bash
mapfile -t awsReg < <(ls ~/regions)

for awsrg in "${awsReg[@]}"
do
    mapfile -t awsSG < <(ls regions/"$awsrg")
       for sg in "${awsSG[@]}"
         do 
            find "$sg" -mindepth 2 -type f -printf '%T+ %p\n' | sort | head -n 1
diff -q ##oldest file## ##all other files###
  done
done

Por exemplo, eu gostaria que em regions -> ap-northeast-1 -> sg-66497903 encontrasse o arquivo sg-66497903-2017-10-03-Tue-12.39.json , definisse como o arquivo para diff dos outros arquivos no diretório com diff -q . Vá para o próximo diretório, encontre o mais antigo nesse diretório .... etc

    
por eekfonky 04.10.2017 / 11:08

3 respostas

1

É muito mais fácil em zsh :

for sg in ~/region/ap-*/sg-*(/); do
  files=($sg/sg-*.json(N.Om)) # list of json regular files sorted
                              # from oldest to newest
  if (($#files >= 2)); then
    oldest=$files[1]
    files[1]=()
    for file in $files; do
      cmp -s $oldest $file ||
        printf '"%s" differs from "%s"\n' $file $oldest
    done
  fi
done

Com ksh93 ou bash e GNU ls , você pode traduzir isso para:

for sg in ~/region/ap-*/sg-*/; do
  eval "files=($(ls --quoting-style=shell-always -rtd -- "$sg"sg-*.json))"
  if ((${#files[@]} >= 2)); then
    oldest=${files[1]}
    files=("${files[@]:1}")
    for file in "${files[@]}"; do
      cmp -s "$oldest" "$file" ||
        printf '"%s" differs from "%s"\n' "$file" "$oldest"
    done
  fi
done
    
por 04.10.2017 / 12:13
1

Bem, você tem o arquivo muito bem nomeado - do valor mais significativo para o menor, então mesmo um tipo de texto simples fará isso Em cada diretamente você pode fazer no bash

myfile=$(ls -1 *.json| sort | head -1)

isso irá definir sua variável $ myfile para o que você precisa e diferenciar tanto quanto você precisa

para obter todos os outros arquivos, exceto seu myfile

ls -1 *.json | grep -v $myfile
    
por 04.10.2017 / 11:20
1

A maneira correta seria usar algo como:

    #!/usr/bin/env bash
    unset -v oldest
    oldest() 
    { local files f old; files=("${1:-.}"/*)
    old="${files[0]}"
     for f in "${files[@]}"
      do [[ $f -ot $old ]] && old=$f ;done
      printf '%s\n' "$old"
    }

Chame o script como em: ./oldest regions/*

    
por 04.10.2017 / 11:27