[英]copy data from s3 to local with prefix
我正在嘗試使用 aws-cli 將數據從 s3 復制到帶有前綴的本地。
但是我在使用不同的正則表達式時遇到了錯誤。
aws s3 cp s3://my-bucket-name/RAW_TIMESTAMP_0506* . --profile prod
錯誤:
未找到匹配項:s3://my-bucket-name/RAW_TIMESTAMP_0506*
aws s3 cp s3://my-bucket/ <local directory path> --recursive --exclude "*" --include "<prefix>*"
這將僅復制具有給定前綴的文件
以上無法正常工作的答案......例如,我在一個目錄中有數千個文件,我希望只檢索需要的文件..所以我嘗試了每個文檔的正確版本:
aws s3 cp s3://mybucket/sub /my/local/ --recursive --exclude "*" --include "20170906*.png"
它沒有下載前綴文件,而是開始下載所有內容
所以我嘗試了上面的示例:
aws s3 cp s3://mybucket/sub/ . /my/local --recursive --include "20170906*"
它還下載了所有內容...這似乎是aws cli的一個持續問題,他們無意修復它...這是我在谷歌搜索時發現的一些解決方法,但它們並不理想。
aws s3 cp
命令不接受通配符作為文件名(鍵)的一部分。 相反,您必須使用--include
和--exclude
參數來定義文件名。
來自: 使用排除和包含過濾器
目前,不支持在命令的路徑參數中使用 UNIX 樣式的通配符。 但是,大多數命令都有
--exclude "<value>"
和--include "<value>"
參數可以達到預期的效果。 這些參數執行模式匹配以排除或包含特定文件或對象。 支持以下模式符號。
所以,你會使用類似的東西:
aws s3 cp s3://my-bucket-name/ . --include "RAW_TIMESTAMP_0506*"
如果您不喜歡靜音控制台,您可以通過管道aws ls
通過awk
並返回到aws cp
。
例子
# url must be the entire prefix that includes folders.
# Ex.: url='s3://my-bucket-name/folderA/folderB',
# not url='s3://my-bucket-name'
url='s3://my-bucket-name/folderA/folderB'
prefix='RAW_TIMESTAMP_0506'
aws s3 ls "$url/$prefix" | awk '{system("aws s3 cp '"$url"'/"$4 " .")}'
解釋
ls
部分非常簡單。 我正在使用變量來簡化和縮短命令。 始終將 shell 變量用雙引號括起來以防止災難。awk {print $4}
只會從ls
輸出中提取文件名(不是 S3 密鑰!這就是為什么 url 必須是包含文件夾的整個前綴。)awk {system("echo " $4")}
會做同樣的事情,但它通過調用另一個命令來完成。注意:我沒有使用子shell $(...)
,因為它會運行整個ls | awk
開始cp
之前的一部分。那會很慢,而且很長一段時間都不會打印任何東西。awk '{system("echo aws s3 cp "$4 " .")}'
將打印與我們想要的非常接近的命令。 注意間距。 如果你嘗試運行它,你會發現有些地方不太對勁。 這將產生類似aws s3 cp RAW_TIMESTAMP_05060402_whatever.log .
awk '{system("echo aws s3 cp '$url'/"$4 " .")}'
是我們正在尋找的。 這會添加文件名的路徑。 仔細看引號。 請記住,我們將awk
參數包含在單引號中,因此如果我們想在該參數中使用 shell 變量,我們必須關閉並重新打開引號。awk '{system("aws s3 cp '"$url"'/"$4 " .")}'
是最終版本。 我們只是刪除echo
以實際執行awk
創建的命令。 當然,我還用雙引號將$url
變量括起來,因為這是一種很好的做法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.