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