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