当文件名中有空格时如何使用 s3cmd put?

当文件名中有空格时如何使用 s3cmd put?

for file in $(find . -type f -mmin -240) do filename=$(echo "$file" | cut -d'.' --complement -s -f1) s3cmd put $file s3://${bucketname}/$filename done

我正在尝试执行上述操作,以便将过去 4 小时内发生更改的所有文件上传到亚马逊的存储桶中,但由于许多文件中都有空格,因此此方法不起作用。

我不断收到以下错误:

ERROR: Parameter problem: Nothing to upload.

我知道我可以使用同步而不是放置,但我不想这样做,因为这个文件夹有超过 30K 个文件,这意味着同步必须在服务器中来回检查,这会花费很长时间并花费额外的钱。

有人知道如何将包含空格的变量传递给它以使其工作吗?

答案1

问题是 bash for 循环使用 $IFS 作为字段分隔符,默认为空格。因此,文件名中以空格分隔的每个部分在循环中都会作为不同的迭代出现。

可以更改 IFS 以匹配换行符而不是空格,并允许正确处理查找输出。

例如:

# save and set IFS
OIFS=$IFS
IFS=$'\n'
# do your processing
for file in $(find . -type f); do echo '>>'${file}"<<"; done
# restore IFS
IFS=$OIFS

相关内容