1

C コードベースがあり、すべて同じディレクトリにあります。同じ名前のコード ファイルを持つヘッダー ファイルをすべて検索したいと考えています。

現在、次のコマンドがあります。

ls *.h | sed s/.h/.c/

これは、検索したいファイル名の「リスト」を返します。このリストを別のコマンドに渡して、どのヘッダー ファイルに同じ名前のコード ファイルがあるかを確認するにはどうすればよいですか?

4

5 に答える 5

6

外部コマンドなし:

$ for i in *.h
> do
>   [ -f  ${i/.h/.c} ] && echo $i
> done

最初の行はすべてのファイルをループします。

3 行目はテスト構成です。(別名) への-fフラグは、ファイルが存在するかどうかを確認します。存在する場合は、戻ります(シェルでは true と見なされます)。前の行が正常に返された場合にのみ、次のコマンドが動作します。testman [0&&

${i/.h/.c} はインプレースのシェル内正規表現置換であるため、テストされるファイルは .h に対応する .c になります。

于 2012-10-25T06:31:13.523 に答える
2

入力を変換する xargs を使用できます。

a
b
c

引数リストに:

a b c

したがって、これは「ab c」を出力するはずです。

echo -e "a\nb\nc" | xargs echo
于 2012-10-25T06:30:10.500 に答える
2
ls `ls *.h|sed s/.h/.c/` 2>/dev/null

トリックを行う必要があります

于 2012-10-25T06:30:15.377 に答える
1
ls -1 *.c* *.h*|awk -F. '{a[$1]++}END{for(i in a){if(a[i]==2)print i".hh"} }'
于 2012-10-25T06:34:47.323 に答える
1
ls *.h | sed s/.h/.c/ | xargs ls 2>/dev/null

コマンドの残りの部分はls、新しい *.c ファイル名で再度実行されます。ls存在しないすべてのファイルについて文句を言うので、stderr をどこにもリダイレクトしません。

なしの例2>/dev/null:

$ ls
a.c a.h b.c c.c d.h
$ ls *.h | sed s/.h/.c/ | xargs ls
ls: d.c: No such file or directory
a.c
于 2012-10-25T06:30:30.433 に答える