다음과 같이 구성된 파일 세트가 있습니다.
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
OR 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
답변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/*