перечислить самый старый файл в каталогах в цикле

У меня есть набор файлов в такой структуре;

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 

Список длиннее, но вы получаете идею. Я пытаюсь найти старейший json-файл в каждом каталоге, который будет использоваться в качестве стандартного для установки в массиве и diff другие файлы в отдельных каталогах.

У меня это до сих пор, но это неправильно.

 #!/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 

Например, я хотел бы в regions -> ap-northeast-1 -> sg-66497903 найти файл sg-66497903-2017-10-03-Tue-12.39.json , установить его как файл для diff других файлов в каталог с diff -q . Перейдите к следующему каталогу, найдите самый старый в этом каталоге …. и т. Д.

Это намного проще в 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 

С помощью ksh93 или bash и GNU ls вы можете перевести это на:

 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 

Ну, у вас есть файл очень хорошо названный – от самого значимого значения до наименьшего, так что даже простая сортировка текста сделает это. В каждом из них вы можете сделать в bash

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

это установит вашу переменную $ myfile на то, что вам нужно, и отложите столько, сколько вам нужно

для получения других файлов, кроме вашего myfile

 ls -1 *.json | grep -v $myfile 

Правильный способ – использовать что-то вроде:

  #!/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" } 

Вызвать скрипт как в: ./oldest regions/*