Linux
如何將輸出文件的每一行作為參數傳遞給同一個 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
首先,如果要檢查文件是否存在,不需要驚嘆號,
!
因為[ -e FILE ]
會返回True if FILE exists
.但問題是您的 bash 腳本無法檢查是否
2019_06
存在,因為這些文件位於 S3 中。$FILES 中的行只是字元串。您可以檢查使用
[ -n STRING ]
哪種方式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
aws s3 ls "s3://path1/path2/" | while read file do # do something with $file done