我试图将文件从一个S3存储桶移动到另一个存储桶并按日期将它们放入文件夹结构中。简单地说,目前所有文件都进入一个文件夹,该文件夹里面有超过500,000个文件,我现在需要对所有这些文件进行排序,并按月将它们放入文件夹中。
文件名类似于: " This_is_a_file_20150403.xml"
所以我遍历S3存储桶中的所有文件,tokensize并获取日期。我创建了一个忽略日期的年月变量并将它们移动到另一个S3存储桶中。但文件名更改为: "这是一个文件20150403.xml"
因此,当我尝试移动它时,AWS无法找到该文件。为什么bash从文件名中删除了下划线?我尝试暂时将文件名存储在tempFilename中,但仍然删除了下划线。
我目前的代码是:
#!/bin/bash
count=0
for filename in $(aws s3 ls s3://stagingbucket)
do
echo $filename
tempFilename=$filename
(IFS='_'; for word in $filename;
do
echo $filename
if [ "$count" -eq 2 ]; then
yearmonth=${word:0:6}
echo $tempFilename
aws s3 cp s3://stagingbucket/$filename s3://archivebucket/$yearmonth/
fi
count=$((count + 1))
done)
done
有什么想法吗?
答案 0 :(得分:0)
让我们来看看你的代码实际上做了什么。
echo $foo
$foo
,根据IFS
echo
echo
然后打印那些带有空格的参数。相反,请使用:
echo "$foo"
...将你的字符串保持在一起 - 同样,也引用你所有的其他扩展。
出于同样的原因(非预期的glob表达式),for word in $filename
是邪恶的;不要这样做。
IFS=_ read -a words <<<"$filename"
for word in "${words[@]}"; do
echo "Processing $word"
done