【问题标题】:Move all images in folder to subfolder, and update all references in text files to those images to their new location?将文件夹中的所有图像移动到子文件夹,并将文本文件中对这些图像的所有引用更新到它们的新位置?
【发布时间】:2011-03-04 15:15:25
【问题描述】:

我有一个文件夹,其中包含约 50 个文本文件 (PHP) 和数百张图片。我想将所有图像移动到一个子文件夹,并更新 PHP 文件,以便对这些图像的任何引用都指向新的子文件夹。

我知道我可以很容易地移动所有图像(mv *.jpg /image、mv *.gif /image 等...),但不知道如何更新所有文本文件 - 我假设必须创建一个正则表达式以匹配文件中的所有图像,然后必须以某种方式将新目录附加到图像文件名?这最好用shell脚本完成吗?任何帮助表示赞赏(服务器是 Linux/CentOs5)

谢谢!

【问题讨论】:

  • 使用正则表达式; sed 可能是你最好的选择。并且您的 PHP 脚本应该有一个用于 images 目录的变量,以防您将来需要更改位置。

标签: regex linux bash shell grep


【解决方案1】:

sed-i 开关可能是您正在寻找的。 -i 告诉 sed 就地编辑文件。

这样的事情应该可以工作:

find /my/php/location -name '*.php' | xargs sed -ie 's,/old/location/,/new/location/,g'

【讨论】:

  • 不需要grep:`find /my/php/location -name '*php'
【解决方案2】:

你可以这样做:

#!/bin/sh
for f in *.jpg *.png *.gif; do 
    mv $f gfx/
    for p in *.txt; do 
        sed -i bak s,`echo $f`,gfx/`echo $f`,g $p 
    done 
done

它会找到所有 jpg/png/gif 文件并将它们移动到“gfx”子文件夹,然后对于每个 txt 文件(或您希望在其中编辑的任何类型的文件)它使用“sed”就地更改路径。

顺便说一句。它将创建带有“bak”额外扩展名的已编辑文件的备份文件。这可以通过省略脚本中的“bak”部分来避免。

【讨论】:

  • 因为有数百个文件,这会很慢。
  • 它可以做得更快,但它是一个解决方案。我可能更喜欢在 Python 中执行此操作,并将所有要更改的路径缓存在列表中,然后将这些更改应用于相关文件。
  • 这就是我最终使用的 - 它有点慢,但它确实起到了作用 - 谢谢!
【解决方案3】:

这会将所有图像移动到名为“images”的子目录,然后通过在基本名称前添加“images/”来仅更改指向图像文件的链接。

mkdir images
mv -f *.{jpg,gif,png,jpeg} images/
sed -i 's%[^/"'\'']\+\.\(gif\|jpg\|jpeg\|png\)%images/\0%g' *.php

如果您有数千个文件,您可能需要使用 find 和 xargs。所以,慢一点

find ./ -regex '.*\(gif\|jpg\|png\|jpeg\)' -exec mv {} /tmp \;
find ./ -name \*.php -print0 | \
xargs -0 sed -i 's%[^/"'\'']\+\.\(gif\|jpg\|jpeg\|png\)%images/\0%g' *.php

注意,它还会更改带有远程 URL 的图像的路径。另外,请确保您有完整的目录备份,php 语法和变量名可能会导致问题。

【讨论】:

    猜你喜欢
    • 2011-09-25
    • 2016-08-03
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多