2015-02-07 127 views
0

我需要尋找具有相同tittles(但不是擴展名!)的文件對的2個dirs,並在某個新命令中合併它們的標題。關於尋找相同的文件對

第一如何打印文件

1)通常我用在for循環以下命令的唯一名稱來選擇爲循環

for file in ./files/* do; 
title=$(base name "file") 
print title 
done 

文件的全名,我應該怎麼在上面的腳本中更改爲只打印文件名稱的標題而不打印其擴展名?

2)如何其可能添加一些條件來檢查兩個文件是否具有相同的名字對他們進行雙循環E,G

# counter for the detected equal files 
i=0 
for file in ./files1/* do; 
title=$(base name "file") #change it to avoid extension within the title 
for file2 in ./files2/* do; 
title2=$(basename "file2") #change it to avoid extension within the title2 
if title1==title2 
echo $title1 and $title2 'has been found!' 
i=i+1 

感謝您的幫助! Gleb

+0

請看http://www.shellcheck.net/ – Cyrus 2015-02-07 10:18:02

回答

1

您可以從腳本中修復語法錯誤開始,如do後跟;,這應該是相反的情況。

然後,該外殼具有操作員從在一個變量開始(###)和結束(%%%)除去的子串。以下是如何列出文件沒有擴展,即去除水珠.*從右側相匹配的最短部分:

for file in *; do 
    printf '%s\n' "${file%.*}" 
done 

閱讀你的shell手冊,以瞭解這些操作符。它會在你的編程生涯中多次爲自己付出:-)

不要相信任何人告訴你使用醜陋和昂貴的管道,並與basename,cut,awk等分叉。這全是矯枉過正。

另一方面,也許有更好的方法來實現你的目標。假設你有文件,就像這樣:

$ find files1 files2 
files1 
files1/file1.x 
files1/file3.z 
files1/file2.y 
files2 
files2/file1.x 
files2/file4.b 
files2/file3.a 

現在創建文件名的兩個列表,擴展剝離:

ls files1 | sed -e 's/\.[^.]*$//' | sort > f1 
ls files2 | sed -e 's/\.[^.]*$//' | sort > f2 

comm效用試驗在兩個文件中共同線:

$ comm f1 f2 
       file1 
file2 
       file3 
     file4 

第一列僅在f1中列出行,僅在f2中列出第二行,並且第二列僅列於第二行。使用-1-2-3選項可以禁止不需要的列。如果你只需要計算普通文件(第三列),請運行

$ comm -1 -2 f1 f2 | wc -l 
     2 
+0

非常感謝這個想法!並且可以將由你的模式創建的文件的標題與一些與文件夾中的文件完全關聯的新變量(如正確的基準名稱)關聯起來?我需要將下一步的名稱與具有相同名稱但與另一個目錄不同擴展名的文件匹配,以找到具有相同標題的對。你能舉一些例子來說明如何用嵌套循環的想法來完成它嗎?事實上,我不是一個程序員,只是使用shell來幫助分析一些科學數據:)謝謝! – user3470313 2015-02-07 21:27:44

+0

@ user3470313這個略有不同的想法提供了相同的答案:1)對於兩個目錄中的每一個,創建一個沒有擴展名的排序文件列表。 2)比較文件列表,告訴每個文件「僅在列表1中」,「僅在列表2中」,「在兩個列表中」? – Jens 2015-02-08 10:53:49

+0

它聽起來不錯,但我不知道如何在shell中創建列表只是在python中做的:)所以我會感謝腳本的例子,它將:1)爲與其名稱關聯的每個循環文件​​創建新變量沒有擴展名或者將名稱放在列表中2)比較兩個列表中的元素。謝謝! Gleb – user3470313 2015-02-09 14:02:14