我有一组结构如下的文件;
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
.转到下一个目录,找到该目录中最旧的目录......等等
答案1
这在以下方面要容易得多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
和 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
答案2
好吧,你的文件命名得很好 - 从最重要的值到最不重要的值,所以即使是简单的文本排序也可以在每个文件中直接执行,你可以在 bash 中执行
myfile=$(ls -1 *.json| sort | head -1)
这会将您的变量 $myfile 设置为您需要的内容,并根据需要进行差异化
获取除 myfile 之外的所有其他文件
ls -1 *.json | grep -v $myfile
答案3
正确的方法是使用类似的东西:
#!/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/*