4

だからここに私が解決できないタスクがあります。.h ファイルを含むディレクトリと、.h ファイルと同じ名前の .i ファイルを含むディレクトリがあります。コマンドを入力するだけで、.i ファイルとして見つからないすべての .h ファイルが必要です。それは難しい問題ではありません。いくつかのプログラミング言語で実行できますが、cmdでどのように見えるか興味があります:)。より具体的には、アルゴリズムは次のとおりです。

  • ls *.h から拡張子なしのファイル名を取得する
  • ls *.i から拡張子なしのファイル名を取得する
  • それらを比較する
  • 2 で満たされていない 1 からのすべての名前を出力します

幸運を!

4

4 に答える 4

5
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$//')2 つのディレクトリで実行lsし、拡張子を切り取り、2 つのリストを比較します。次にgrep '$<'、最初のリストにのみあるファイルを検索し、挿入された文字をcut -c3-切り捨てます。"< "diff

于 2012-11-29T09:09:50.020 に答える
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'
于 2012-11-29T09:14:45.370 に答える
0

bash がシェルであると仮定します。

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

間違いなく、これは実質的に他のすべてのシェルに移植できます。これは他のいくつかのアプローチよりも不可解ではありませんが (これは確かに私の問題ですが)、少し冗長です。そのような。シェルスクリプトはそれを思い出すのに役立つかもしれません.

于 2012-11-29T10:43:25.087 に答える
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 および *.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}'

上記は、ファイル名を持つものと拡張子を除くものを持つ 2 つの連想配列を作成します。hh ファイルと ii ファイルの両方が存在する場合、連想配列の値は 2 になります。ファイルが 1 つしかない場合、値は 1 になります。したがって、値が 1 である配列項目が必要であり、それはヘッダー ファイル (.hh) である必要があります。これは、END ブロックで行われる asso..array b を使用してチェックできます。

于 2012-11-29T09:36:43.053 に答える