2011-11-17 16 views
0

如何製作一個Bash shell腳本,可以識別所有的.jpg,.gif和.png文件,然後確定哪些文件沒有通過url(),href或src鏈接到任何文本文件中一個文件夾?如何讓Bash腳本在項目中查找未使用的圖像?

這是我開始的,但我最終得到了我想要的結果。我不想知道引用的圖像,但未引用(又名「孤兒」)圖像:

# 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? 
+0

請將代碼放入您的文章中,而不是通過鏈接。 – plundra

回答

5

隨着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 
3
ls -R *jpg *gif *png | xargs basename > /tmp/patterns 
grep -f /tmp/patterns *html 

第一行(遞歸 - 你的問題是生病指定的,所以我想我會是一個小將軍)找到所有的圖像,並剝離目錄部分使用basename。將其保存在模式列表中。然後grep在所有html文件中使用該列表。

+0

沒有工作。保持說缺少參數。必須使用find -exec來切換ls/xargs才能使基名起作用。也只能運行命令爲JPG,然後GIF,然後PNG,但附加到/ tmp /模式。一旦建立,我可以使用grep -Rf/tmp/patterns mydir |貓找到與我的模式相匹配的行,但是如何找到模式中mydir(和子目錄)文件中沒有匹配的行? – Volomike

+1

哎呀,我錯過了「不」,對不起! $(cat/tmp/patterns);而不是'grep -f/tmp/patterns'。做grep -R $ p * html; done'檢查grep(或輸出)的返回碼,並根據需要標記你的孤兒。 – drysdam

3

我有點遲到了(我找到了這個網頁,同時尋找自己的答案),但如果它是有用的人,這裏是與文件名返回的路徑略加修改(尋找與一些更多的文件類型):

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

要注意,雖然,你可以得到誤報只是看代碼靜態這樣是很重要的,因爲代碼可能會動態創建一個文件名是那麼引用(並預期存在)。因此,如果您盲目刪除所有通過此腳本返回路徑的文件,而無法瞭解您的項目,則可能會後悔。