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

Переименование файлов, полученных с помощью «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.

Моя единственная проблема теперь, что все «cache-busted» активы теперь запрещены в доступе на Amazon. Проблема в том, что я wgetполучил файлы с параметрами запроса, включенными в их имя файла, и мне нужно будет переименовать их.

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

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

Как это сделать в Mac OS X с помощью Bash 3.2?

решение1

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

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.

решение2

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

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

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

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

решение3

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

# 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 *glob соответствующим образом. Сначала вам следует проверить финальную команду с помощью echo, т.е. заменить mv $f $newfна echo $f $nfи убедиться, что она делает то, что вам нужно.

Связанный контент