【问题标题】:How Do I Make a Bash Script To Find Unused Images in a Project?如何制作 Bash 脚本来查找项目中未使用的图像?
【发布时间】:2011-12-30 23:13:49
【问题描述】:

如何制作一个可以识别所有 .jpg、.gif 和 .png 文件的 Bash shell 脚本,然后识别这些文件中的哪些文件没有通过任何文本文件中的 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?

【问题讨论】:

    标签: image bash shell grep


    【解决方案1】:

    我参加聚会有点晚了(我自己在寻找答案时发现了这个页面),但如果它对某人有用,这里有一个稍微修改过的版本,它返回带有文件名的路径(并搜索更多文件类型):

    #!/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
    

    但是,重要的是要注意,像这样静态查看代码可能会得到误报,因为代码可能会动态创建一个文件名,然后引用(并且预期存在)。因此,如果您在不了解您的项目的情况下盲目地删除所有路径由该脚本返回的文件,您可能会后悔。

    【讨论】:

      【解决方案2】:

      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 <path to my images folder> 吗?
      【解决方案3】:
      ls -R *jpg *gif *png | xargs basename > /tmp/patterns
      grep -f /tmp/patterns *html
      

      第一行(递归——你的问题没有明确说明,所以我想我会有点笼统)查找所有图像并使用basename 剥离目录部分。将其保存在模式列表中。然后 grep 在所有 html 文件中使用该列表。

      【讨论】:

      • 没用。一直说缺少参数。必须使用 find -exec 切换 ls/xargs 才能使 basename 工作。也只能运行 jpg、gif、png 的命令,但附加到 /tmp/patterns。一旦确定,我可以使用 grep -Rf /tmp/patterns mydir | cat 查找与我的模式匹配的行,但是如何在模式中找到在 mydir(和 subdirs')文件中不匹配的行?
      • 糟糕,我错过了那个“不”,对不起!而不是grep -f /tmp/patternsfor p in $(cat /tmp/patterns); do grep -R $p *html; done 检查grep(或输出)的返回码并根据需要标记您的孤儿。
      猜你喜欢
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      • 2020-10-07
      相关资源
      最近更新 更多