S3 버킷에 있는 하위 폴더의 전체 크기를 가져오기 위해 bash 스크립트를 작성하려고 합니다.
내 양동이s3://path1/path2/subfolders
path2 폴더 안에는 다음과 같은 많은 하위 폴더가 있습니다.
2019_06
2019_07
2019_08
2019_09
2019_10
2019_11
2019_12
Bash 스크립트에서 각 하위 폴더의 크기를 가져와야 합니다.
나는 이런 대본을 썼다.
#!/bin/bash
FILES=$(mktemp)
aws s3 ls "s3://path1/path2/" >> "$FILES"
cat $FILES
echo
for file in $FILES
do
if [ ! -e "$file" ]
then
s3cmd du -r s3://path1/path2/$file
echo "$file"; echo
continue
fi
echo
done
cat $tmpfile의 출력은 다음과 같습니다
2019_06
2019_07
2019_08
2019_09
2019_10
2019_11
2019_12
하지만 오류가 발생합니다. for 루프에 변수를 전달할 때. 이상적으로 내 목표는 for 루프가 각 반복마다 do 내부에서 실행되는 것입니다. 명령은 다음과 같아야 합니다.
s3cmd du -r s3://path1/path2/2019_06
s3cmd du -r s3://path1/path2/2019_07
s3cmd du -r s3://path1/path2/2019_08
등...
이렇게하면 폴더의 전체 크기를 얻을 수 있습니다
도와주세요!
고쳐 쓰다 제안한 대로 코드를 편집했습니다.
#!/bin/bash
FILES=$(mktemp)
aws s3 ls "s3://path1/path2/" >> "$FILES"
for file in `cat $FILES`
do
if [ -n "$file" ]
echo $file
done
답변1
aws s3 ls "s3://path1/path2/" | while read file
do
# do something with $file
done
답변2
첫째, 파일이 존재하는지 확인하려면 느낌표 가 반환되므로 !
느낌표 가 필요하지 않습니다 .[ -e FILE ]
True if FILE exists
그러나 문제는 2019_06
파일이 S3에 있기 때문에 bash 스크립트가 존재 여부를 확인할 수 없다는 것입니다. $FILES의 줄은 단지 문자열입니다.
[ -n STRING ]
whichmeans 로 확인할 수 있습니다 True if the length of "STRING" is non-zero
.
for file in `cat $FILES`
do
if [ -n "$file" ]
then
echo $file
s3cmd du -r s3://path1/path2/$file
fi
done
답변3
일부 특수한 경우에는 와일드카드를 사용하면 문제가 발생할 수 있습니다. 아래에 사용된 방법은 find
이러한 문제가 발생할 가능성이 적습니다.
find "s3://path1/path2/" -type f | while read -r file
do
echo $file
done