Переименование файлов, извлеченных с помощью "wget --mirror" в Bash, перед загрузкой в ​​статически размещенную область Amazon S3

Я пытаюсь заархивировать и загрузить старый сайт в статически размещенную область Amazon S3.

Я смог получить содержимое с wget, используя следующую команду:

wget --mirror --no-parent --html-extension --page-requisites http://original.com

Затем я мог бы заменить все ссылки на их новый URL:

ag -l original\.com -0 | xargs -0 sed -i '' \
's|original.com|old.original.com|g'

После этого я загрузил сайт в Amazon S3, используя s3cmd sync,

Моя единственная проблема сейчас, когда все активы, "кешированные", теперь недоступны в Amazon. Проблема в том, что wget Я получил файлы с параметрами запроса, включенными в их имя файла, и мне нужно их переименовать.

Поэтому я хотел бы рекурсивно переименовывать файлы во всех подпапках, например:

  • style.css?ver=4.2.5.css переименован в style.css

Как я могу сделать это в Mac OS X, используя Bash 3.2?

3 ответа

Решение

Это должно работать:

find . -maxdepth 1 -type f -name '*\?*' |\
  while read FILENAME
  do
    IFS='?'
    SPLIT_FILENAME=(${FILENAME})
    unset IFS
    echo mv "${FILENAME}" "${SPLIT_FILENAME}"
    # mv "${FILENAME}" "${SPLIT_FILENAME}"
  done

find . указывает на то, что все действия происходят в текущем каталоге, а также в дочерних каталогах; не стесняйтесь изменить это . быть полным / фактическим путем к файлу того, что вы действуете. -name '*\?*' ищет файлы с вопросительным знаком (?) в его названии.

Эта начальная / демо-версия также имеет -maxdepth установите в "1", чтобы процесс не вышел из-под контроля в вашей файловой системе, и он использует echo версия команды, чтобы показать вам, что она будет делать, прежде чем запустить ее по-настоящему.

Если вы запускаете, что вывод выглядит хорошо, не стесняйтесь настроить -maxdepth 1 что-то вроде -maxdepth 9 или даже полностью удалить это, а затем закомментировать echo линия и раскомментируйте mv линия, так это выглядит так:

find . -type f -name '*\?*' |\
  while read FILENAME
  do
    IFS='?'
    SPLIT_FILENAME=(${FILENAME})
    unset IFS
    # echo mv "${FILENAME}" "${SPLIT_FILENAME}"
    mv "${FILENAME}" "${SPLIT_FILENAME}"
  done

Используя ваш тестовый файл пример style.css?ver=4.2.5.cssЯ получил этот вывод при запуске этого скрипта в моей системе Mac OS X 10.9.5 (Mavericks):

mv ./style.css?ver=4.2.5.css ./style.css

Похоже, хороший переключатель для меня. Побежал с реальным mv команда и файл был успешно переименован в style.css, Это также будет работать с файлами, в которых есть пробелы, такими как тестовые файлы, такие как this is my style.css?ver=4.2.5.css а также my style.css?ver=4.2.5.css,

Это будет работать на Mac OS X при условии, что есть только один ? на URL/ оригинальное имя файла:

find . -name "*\?*" -exec sh -c 'var="{}" ; mv "{}" "${var%\?*}"' \;

Для справки, это будет работать также на системах Linux или любой системе, которая имеет rename инструмент установлен:

find . -name "*\?*" -exec rename "s/\?.*//" "{}" \;

Я буду использовать эхо для демонстрации.

# echo 'style.css?ver=4.2.5.css' | cut -d? -f2-9999
ver=4.2.5.css

Рекурсия:

cd <yourdir>
for f in *; do
    newf=$( echo $f | cut -d? -f2-9999 )
    mv $f $newf
done

Предположения: <yourdir> содержит только файлы, которые вы хотите изменить. Если нет, измените for f in * шар в костюме. Сначала вы должны проверить последнюю команду с помощью echo, т.е. заменить mv $f $newf с echo $f $nf и убедитесь, что он делает то, что вы хотите.

Другие вопросы по тегам