Linux

當文件名中有空格時如何使用 s3cmd put?

  • September 13, 2016

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 的文件,這意味著同步必須在伺服器中來回檢查,這需要很長時間並且需要額外的錢。

任何人都知道如何將包含空格的變數傳遞給它以使其工作?

問題是 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

引用自:https://serverfault.com/questions/802562