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