我正在尝试将旧网站存档并上传到静态托管的 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
。
我现在唯一的问题是,所有“缓存破坏”的资产现在在亚马逊上都被拒绝访问。问题是,wget
我的文件在文件名中包含查询参数,我需要重命名它们。
所以我想在所有子文件夹中递归重命名文件,例如:
style.css?ver=4.2.5.css
重命名为style.css
我如何使用 Bash 3.2 在 Mac OS X 中做到这一点?
答案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
?
假设URL/原始文件名中只有一个字符,那么这将在 Mac OS X 上运行:
find . -name "*\?*" -exec sh -c 'var="{}" ; mv "{}" "${var%\?*}"' \;
作为参考,这也可以在rename
安装了该工具的 Linux 系统或任何系统上运行:
find . -name "*\?*" -exec rename "s/\?.*//" "{}" \;
答案3
我将使用 echo 来演示。
# 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>
仅包含您想要更改的文件。如果不是,请更改 globfor f in *
以适应。您应该先用 echo 测试最终命令,即替换mv $f $newf
为echo $f $nf
并确保它能达到您的要求。