출력 파일의 각 줄을 동일한 bash 스크립트의 for 루프에 매개변수로 전달하는 방법은 무엇입니까?

출력 파일의 각 줄을 동일한 bash 스크립트의 for 루프에 매개변수로 전달하는 방법은 무엇입니까?

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

관련 정보