我們每天下載大量原始檔案,并希望根據名稱對檔案進行排序,并將它們移動到 s3 存盤桶中的相應路徑。
例如,所有以 FOO_ _ .csv開頭的檔案都需要移動到路徑 s3://bucket_name/test/FOO 以及以 BAR _ .csv開頭的檔案到 s3://bucket_name/test/BAR。
經過大量研究,我得到了以下結果,但現在所有檔案都移到了 s3://bucket_name/test/FOO 和 s3://bucket_name/test/BAR。我顯然缺少一些邏輯,但不確定是什么。請建議。
#!/usr/bin/env bash
SFTP="sftp user@sftpserver"
FOLDER="/data"
TARGET="/home/completed"
DEST="FOO BAR"
S3_PREFIX="s3://bucket_name/test/"
FILES=`$SFTP <<EOF
cd $FOLDER
ls
EOF`
FILES=`echo $FILES|sed "s/.*sftp> ls//"`
(
echo cd $FOLDER
for F in $FILES; do
echo get $F $TARGET
done
) | $SFTP
for dest in $DEST; do
ldir="$LOCAL_PREFIX/$dest"
aws s3 cp $TARGET $S3_PREFIX/$dest --recursive --exclude "*" --include "*.csv"
done
uj5u.com熱心網友回復:
您的腳本正在對兩個不同的 s3“路徑”執行遞回 s3 復制。您需要檢查每個檔案名以了解要使用的特定 s3 前綴。
一種可能性是使用 find 來定位要復制的 FOO/BAR .csv 檔案,然后檢查每個檔案以確定要使用的 s3 前綴。
就像是:
#!/bin/bash
src_dir=${1:-/tmp/test}
s3_prefix="s3://bucket_name/test/"
while read -r -d '' line ; do
if [[ $(grep -c 'FOO' <<<${line}) -eq 1 ]] ; then
echo "copying ${line} to ${s3_prefix}/FOO${line}"
#aws s3 cp "${line}" "${s3_prefix}/FOO${line}"
else
echo "copying ${line} to ${s3_prefix}/BAR${line}"
#aws s3 cp "${line}" "${s3_prefix}/BAR${line}"
fi
done < <(find "${src_dir}" \( -name 'FOO*.csv' -o -name 'BAR*.csv' \) -print0 )
給定目錄結構和檔案,例如:
/tmp/test/src/one:
BAR_one.csv BAR_one.txt FOO_one.csv FOO_one.txt
/tmp/test/src/three:
BAR_three.csv FOO_three.csv junk.txt test.tmp
/tmp/test/src/two:
BAR_two.csv FOO_two.csv junk.csv
示例輸出將是:
copying /tmp/test/src/three/FOO_three.csv to s3://bucket_name/test//FOO/tmp/test/src/three/FOO_three.csv
copying /tmp/test/src/three/BAR_three.csv to s3://bucket_name/test//BAR/tmp/test/src/three/BAR_three.csv
copying /tmp/test/src/one/FOO_one.csv to s3://bucket_name/test//FOO/tmp/test/src/one/FOO_one.csv
copying /tmp/test/src/one/BAR_one.csv to s3://bucket_name/test//BAR/tmp/test/src/one/BAR_one.csv
copying /tmp/test/src/two/BAR_two.csv to s3://bucket_name/test//BAR/tmp/test/src/two/BAR_two.csv
copying /tmp/test/src/two/FOO_two.csv to s3://bucket_name/test//FOO/tmp/test/src/two/FOO_two.csv
為檔案名添加一些完整性檢查以確保符合 s3 物件命名約定可能是值得的。此外,shellcheck是檢查腳本錯誤的絕佳資源。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/323961.html
上一篇:將具有逗號分隔值的變數拆分為bashshell中的兩個隨機部分
下一篇:獲取腳本時bash陷阱不起作用
