C コードベースがあり、すべて同じディレクトリにあります。同じ名前のコード ファイルを持つヘッダー ファイルをすべて検索したいと考えています。
現在、次のコマンドがあります。
ls *.h | sed s/.h/.c/
これは、検索したいファイル名の「リスト」を返します。このリストを別のコマンドに渡して、どのヘッダー ファイルに同じ名前のコード ファイルがあるかを確認するにはどうすればよいですか?
外部コマンドなし:
$ for i in *.h
> do
> [ -f ${i/.h/.c} ] && echo $i
> done
最初の行はすべてのファイルをループします。
3 行目はテスト構成です。(別名) への-f
フラグは、ファイルが存在するかどうかを確認します。存在する場合は、戻ります(シェルでは true と見なされます)。前の行が正常に返された場合にのみ、次のコマンドが動作します。test
man [
0
&&
${i/.h/.c} はインプレースのシェル内正規表現置換であるため、テストされるファイルは .h に対応する .c になります。
入力を変換する xargs を使用できます。
a
b
c
引数リストに:
a b c
したがって、これは「ab c」を出力するはずです。
echo -e "a\nb\nc" | xargs echo
ls `ls *.h|sed s/.h/.c/` 2>/dev/null
トリックを行う必要があります
ls -1 *.c* *.h*|awk -F. '{a[$1]++}END{for(i in a){if(a[i]==2)print i".hh"} }'
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