1

Я пытаюсь заархивировать и загрузить старый сайт в статически размещенную область 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 ответа3

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 .

1

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

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

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

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

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

# 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 и убедиться, что она делает то, что вам нужно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .