Bash

循環列出目錄中最舊的文件

  • October 4, 2017

我在這樣的結構中有一組文件;

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

使用ksh93orbash和 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

引用自:https://unix.stackexchange.com/questions/396004