2015-04-02 86 views
1

我有一個文件列表模式文件創建輸出,與多條線路是這樣的:基於輸入線

./file_name_0.jpg 
./file_name_1.jpg 
./file_name_2.jpg 
./file_name_3.jpg 
./file_name_4.jpg 
./file_name_5.jpg 
./file_name.jpg 
./file_name1_0.jpg 
./file_name1_1.jpg 
./file_name1.jpg 
./file_name2_0.jpg 
./file_name2_1.jpg 
./file_name2_2.jpg 
./file_name2_3.jpg 
./file_name2_4.jpg 
./file_name2_5.jpg 
./file_name2.jpg 

在上面我有兩個文件我知道已經被完全複製6上市倍。我想要刪除這些重複項。在文件被複制少於6次的情況下,我想保留文件。

換句話說,我想實現的是刪除其中的文件名都在變化_0.jpg_1.jpg_2.jpg_3.jpg_4.jpg_5.jpg末的所有文件。

對於上面的輸入,我想這樣的事情作爲輸出

rm ./file_name_0.jpg 
rm ./file_name_1.jpg 
rm ./file_name_2.jpg 
rm ./file_name_3.jpg 
rm ./file_name_4.jpg 
rm ./file_name_5.jpg 
# ./file_name.jpg # do not remove, it is the original file. 
# ./file_name1_0.jpg # do not remove, it is a legitimate copy. 
# ./file_name1_1.jpg # do not remove, it is a legitimate copy. 
# ./file_name1.jpg # do not remove, it is the original file. 
rm ./file_name2_0.jpg 
rm ./file_name2_1.jpg 
rm ./file_name2_2.jpg 
rm ./file_name2_3.jpg 
rm ./file_name2_4.jpg 
rm ./file_name2_5.jpg 
# ./file_name2.jpg 

我遇到的是確保文件如file_name1_1.jpg難度不會被刪除 - 這是一個合法的文件,因爲還有不到該集合中有6個重複。

+0

它你的意思是有點不清楚。你爲什麼不用'rm。/ filename1_1.jpg'而是'#。/ filename1_1.jpg'? – fedorqui 2015-04-02 14:11:06

+0

如果存在0-5的所有六個文件,則OP想要刪除整組filename_n_ *。 – user1717259 2015-04-02 14:17:19

+0

是的當且僅當我從_0.jpg,_1.jpg,_2.jpg直到_5.jpg都有六個。只有這樣我纔想刪除它們。 – mcaleaa 2015-04-02 14:25:55

回答

0

下面是一個可執行的awk腳本這將表明所需的文件爲「RM」:

#!/usr/bin/awk -f 

BEGIN {FS="_"} 

{ sub(FS $NF "$", ""); key=$0 } # make a key by dropping the last field 

{ cnts[key]++ }   # count how many matching prefixes there are 

END { 
    for(key in cnts) {   # for a count `key` in cnts 
    if(cnts[key]==6) {   # check to see if the `key` cnt is 6 
     for(i=0;i<6;i++) {  # if it is build an output line for each case 
     print "rm " key FS i ".jpg" # make the output `command` here. 
     } 
    } 
    } 
} 

這並不表明被保留的線路。它僅爲每個應刪除的文件創建一個rm命令。還要注意,它假定每個文件都以「.jpg」結尾。輸出的順序不能保證,但如果您需要訂購,可以通過sort進行輸送。這也應該在文件名中出現_的情況下起作用。

從您的輸入,它產生:

rm ./filename2_0.jpg 
rm ./filename2_1.jpg 
rm ./filename2_2.jpg 
rm ./filename2_3.jpg 
rm ./filename2_4.jpg 
rm ./filename2_5.jpg 
rm ./filename_0.jpg 
rm ./filename_1.jpg 
rm ./filename_2.jpg 
rm ./filename_3.jpg 
rm ./filename_4.jpg 
rm ./filename_5.jpg 
+0

謝謝。是否可以編輯FS以便它僅匹配下劃線「_」的最後一個實例。一些file_names在它們中有下劃線。 – mcaleaa 2015-04-02 14:59:23

+0

在這種情況下,由於數據並沒有真正保存,所以我會主張爲'cnts'創建一個不同的密鑰。我正在通過消隱'$ 0'中的最後一個字段來做到這一點。 – n0741337 2015-04-02 15:16:33

0

這不是正好解決你的問題,因爲它實際上並不確定文件0-5在那裏。相反,它只是檢查,有6個後綴的文件有:

grep _ temp.txt | cut -d_ -f1 | sort | uniq -c | \ 
grep '^ *6' | sed -e 's/^ *6 /rm /' -e 's/$/_*.jpg/' 

首先,它隔離帶下劃線的線條,然後它會只是部分第一個下劃線之前,那麼排序的一切,然後計算髮生的次數然後它只抓取發生6次的前綴,然後用rm替換計數,並在末尾添加一個glob以匹配具有該前綴的所有文件。