Назад | Перейти на главную страницу

Как использовать 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 часа, в корзину в Amazon, но поскольку во многих файлах есть пробелы, это не работает.

Я получаю следующую ошибку:

ERROR: Parameter problem: Nothing to upload.

Я знаю, что могу использовать синхронизацию вместо размещения, но я не хочу этого делать, потому что в этой папке более 30К файлов, и это будет означать, что синхронизация должна проверять и продвигаться на сервере, что займет много времени и потребует дополнительных денег.

Кто-нибудь знает, как передать переменные, содержащие пробелы, чтобы это работало?

Проблема в том, что цикл bash for использует $ IFS в качестве разделителя полей, который по умолчанию равен пробелу. Таким образом, каждая часть имени файла, разделенная пробелом, будет представлять собой отдельную итерацию в цикле.

IFS можно изменить так, чтобы он соответствовал новой строке вместо пробела и позволял корректно обрабатывать вывод find.

Например:

# 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