所以這裏比較兩個LS的輸出爲我解決不了的任務。我有一個帶有.h文件的目錄和一個帶有.i文件的目錄,它們與.h文件具有相同的名稱。我只想通過輸入一個命令來獲得所有.h文件,這些文件都不是.i文件。這不是一個難題,我可以用一些編程語言來完成,但我只是好奇它在cmd中的樣子:)。更具體地講這裏的算法中:如何在Linux
- 沒有從LS的* .h
- 獲取文件名擴展名獲取文件名,而無需從LS擴展名爲*。我
- 比較它們
- 打印全部來自名1未在2
運氣好碰到!
所以這裏比較兩個LS的輸出爲我解決不了的任務。我有一個帶有.h文件的目錄和一個帶有.i文件的目錄,它們與.h文件具有相同的名稱。我只想通過輸入一個命令來獲得所有.h文件,這些文件都不是.i文件。這不是一個難題,我可以用一些編程語言來完成,但我只是好奇它在cmd中的樣子:)。更具體地講這裏的算法中:如何在Linux
運氣好碰到!
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
插入"< "
字符。
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'
結果從我的測試是: 這樣 這樣 這樣 但它應該是: hotfloorplan 熱點 熱點,IFACE NPE 這樣 – zwx
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來檢查。
抱歉,它不工作。結果是:ls:dir1/*。hh:沒有這樣的文件或目錄 ls:dir2/*。ii:沒有這樣的文件或目錄。無論如何,這是一個封閉的問題。感謝您的迴應:) – zwx
假定是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腳本可能有助於回憶它。
請看看在linux SED程序。 –