2012-11-29 39 views
4

所以這裏比較兩個LS的輸出爲我解決不了的任務。我有一個帶有.h文件的目錄和一個帶有.i文件的目錄,它們與.h文件具有相同的名稱。我只想通過輸入一個命令來獲得所有.h文件,這些文件都不是.i文件。這不是一個難題,我可以用一些編程語言來完成,但我只是好奇它在cmd中的樣子:)。更具體地講這裏的算法中:如何在Linux

  • 沒有從LS的* .h
  • 獲取文件名擴展名獲取文件名,而無需從LS擴展名爲*。我
  • 比較它們
  • 打印全部來自名1未在2

運氣好碰到!

+0

請看看在linux SED程序。 –

回答

4
diff \ 
    <(ls dir.with.h | sed 's/\.h$//') \ 
    <(ls dir.with.i | sed 's/\.i$//') \ 
| grep '$<' \ 
| cut -c3- 

diff <(ls dir.with.h | sed 's/\.h$//') <(ls dir.with.i | sed 's/\.i$//')執行上的兩個目錄ls,切斷擴展和兩個列表進行比較。然後grep '$<'發現,僅在第一個上市的文件,cut -c3-切斷該diff插入"< "字符。

+0

感謝您的超級快速響應。我測試和結果是: ls:dir.with.i:沒有這樣的文件或目錄 ls:dir.with.h:沒有這樣的文件或目錄 – zwx

+1

我解決了它通過使你的建議小mod: comm - 23 <(ls * .h | sed's/\。h $ //')<(ls * .i | sed's/\。我$ //') 感謝您的想法;) – zwx

0
ls ./dir_h/*.h | sed -r -n 's:.*dir_h/([^.]*).h$:dir_i/\1.i:p' | xargs ls 2>&1 | \ 
grep "No such file or directory" | awk '{print $4}' | sed -n -r 's:dir_i/([^:]*).*:dir_h/\1:p' 
+0

結果從我的測試是: 這樣 這樣 這樣 但它應該是: hotfloorplan 熱點 熱點,IFACE NPE 這樣 – zwx

0
ls -1 dir1/*.hh dir2/*.ii | awk -F"/" '{print $NF}' |awk -F"." '{a[$1]++;b[$0]}END{for(i in a)if(a[i]==1 && b[i".hh"]) print i}' 

解釋:

ls -1 dir1/*.hh dir2/*.ii 

上面會列出所有文件*在這兩個目錄.hh和*。②文件。

awk -F"/" '{print $NF}' 

以上將只打印不包括文件的完整路徑的文件名。

awk -F"." '{a[$1]++;b[$0]}END{for(i in a)if(a[i]==1 && b[i".hh"]) print i}' 

上面將創建兩個關聯數組一個與文件名,一個與不包括擴展名。 如果兩個HH和II的文件存在assosciative數組中的值將2如果只有一個文件,那麼該值將是1.so我們需要其值是1的數組項,它應該是一個頭文件(.hh)。 這可以使用在END塊中完成的asso..array b來檢查。

+0

抱歉,它不工作。結果是:ls:dir1/*。hh:沒有這樣的文件或目錄 ls:dir2/*。ii:沒有這樣的文件或目錄。無論如何,這是一個封閉的問題。感謝您的迴應:) – zwx

0

假定是bash shell中:

for file in $(ls dir_with_h/*.h); do 
    name=${file%\.h};   # trim trailing ".h" file extension 
    name=${name#dir_with_h/}; # trim leading folder name 
    if [ ! -e dir_with_i/${name}.i ]; then 
     echo ${name}; 
    fi 
done 

毫無疑問,這可以被移植到幾乎所有其他炮彈。我覺得這比一些其他方法不太神祕的(雖然這肯定是我的問題),但它是一個有點羅嗦。因此。一個shell腳本可能有助於回憶它。