如何制作一个Bash脚本来查找项目中未使用的图像?

6

如何编写一个Bash shell脚本,以识别文件夹中所有的.jpg、.gif和.png文件,并确定这些文件中哪些没有在任何文本文件中通过url()、href或src进行链接?

以下是我开始的内容,但最终得到的结果与我想要的相反。我不想知道被引用的图像,而是未被引用的(也称为“孤立”的)图像:

# Change MYPATH to the path where you have the project
find MYPATH -name *.jpg -exec basename {} \; > /tmp/patterns
find MYPATH -name *.png -exec basename {} \; >> /tmp/patterns
find MYPATH -name *.gif -exec basename {} \; >> /tmp/patterns

# Print a list of lines that reference these files
# The cat command simply removes coloring
grep -Rf /tmp/patterns MYPATH | cat

# great -- but how do I print the lines of /tmp/patterns *NOT* listed in any given
# *.php, *.css, or *.html?
3个回答

9

drysdam的帮助下,我编写了这个Bash脚本,我称之为orphancheck.sh,并使用"./orphancheck.sh myfolder"进行调用。

#!/bin/bash

MYPATH=$1

find "$MYPATH" -name *.jpg -exec basename {} \; > /tmp/patterns
find "$MYPATH" -name *.png -exec basename {} \; >> /tmp/patterns
find "$MYPATH" -name *.gif -exec basename {} \; >> /tmp/patterns

for p in $(cat /tmp/patterns); do
    grep -R $p "$MYPATH" > /dev/null || echo $p;
done

假设我想删除名为 images 的目录中的图像,我会执行 ./orphancheck.sh <我的图像文件夹路径> - Blessing

5

我来晚了(我自己找答案的时候找到了这个页面),但如果有人需要的话,这里有一个稍微修改过的版本,它返回带有文件名的路径(并搜索了更多的文件类型):

#!/bin/bash

if [ $# -eq 0 ]
  then
    echo "Please supply path to search under"
    exit 1
fi
MYPATH=$1

find "$MYPATH" -name *.jpg > /tmp/patterns
find "$MYPATH" -name *.png >> /tmp/patterns
find "$MYPATH" -name *.gif >> /tmp/patterns
find "$MYPATH" -name *.js >> /tmp/patterns
find "$MYPATH" -name *.php >> /tmp/patterns

for p in $(cat /tmp/patterns); do
    f=$(basename $p);
    grep -R $f "$MYPATH" > /dev/null || echo $p;
done

需要注意的是,仅通过静态查看代码可能会得到误报,因为代码可能会动态创建一个文件名,然后引用该文件(并期望该文件存在)。因此,如果您盲目删除此脚本返回路径的所有文件,而没有了解您的项目,可能会后悔。


3
ls -R *jpg *gif *png | xargs basename > /tmp/patterns
grep -f /tmp/patterns *html

首先(递归地——由于您的问题并不明确,所以我想稍微概括一下)找到所有图片,并使用 basename 剥离目录部分。将其保存在一个模式列表中。然后,在所有HTML文件中使用该列表进行 grep


没有起作用。一直说缺少参数。不得不用find -exec替换ls/xargs才能让basename正常工作。而且只能为jpg、gif、png运行命令,但追加到/tmp/patterns中。一旦这个被建立了,我可以使用grep -Rf /tmp/patterns mydir | cat来查找与我的模式匹配的行,但是如何找到在模式中没有匹配的mydir(和子目录)文件中的行呢? - Volomike
1
哎呀,我错过了那个“不”字,抱歉!请使用 for p in $(cat /tmp/patterns); do grep -R $p *html; done 替代 grep -f /tmp/patterns。检查 grep 的返回代码(或输出),并根据需要标记您的孤儿文件。 - drysdam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接