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

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小时内发生更改的所有file upload到亚马逊的存储桶中,但是由于许多文件中都有空格,因此无法正常工作。

我不断收到以下错误:

ERROR: Parameter problem: Nothing to upload.

我知道我可以使用同步而不是放,但我不想这样做,因为这个文件夹有超过30K的文件,这将意味着同步必须在服务器中检查,这将需要时间和成本额外的钱。

任何人都知道如何将包含空格的variables传递给它来使其工作?

问题是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