如何将输出文件的每一行作为参数传递给同一 bash 脚本中的 for 循环?

如何将输出文件的每一行作为参数传递给同一 bash 脚本中的 for 循环?

我正在尝试编写一个 bash 脚本来获取 S3 存储桶中子文件夹的总大小。

我的桶道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

ETC...

这样我就可以获得文件夹的总大小

请帮忙!

更新 我已经按照建议编辑了代码

#!/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

但问题是您的 bash 脚本无法检查是否2019_06存在,因为这些文件位于 S3 中。 $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

相关内容