Bash
循環列出目錄中最舊的文件
我在這樣的結構中有一組文件;
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
orbash
和 GNUls
,您可以將其翻譯為: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