.cとMakefileの両方を含むフォルダがあります。どのフォルダにこのアイテムがあるかを知る必要があります。このフォルダを見つけるには、Linuxでどのコマンドを入力する必要がありますか?
ベストアンサー1
そしてzsh
:
has() ()(($#)) $REPLY/$~1(N)
ls -- **/*(/e{has Makefile}e{has \\*.c})
has
引数として指定されたglobが$REPLY
ディレクトリ内のすべてのファイルをチェックすることを確認する関数として定義されます。e
ディレクトリを選択するかどうかを決定するには、glob修飾子でこの関数を使用します。次のzsh機能のいくつかは次のとおりです。
() {compound-command} arguments
:匿名機能です。ここで、関数のコードは次のとおりです(($#))
。パラメータ数が0でない場合はtrueを返します。$~1
:zsh
パラメータ拡張中は、デフォルトでは分割+glob操作は行われません。$~1
要求するには明示的に要求する必要があります。全体的な状況拡張部分はパターンと見なされます$1
。$1
(N)
:有効なグローバル修飾子空のボールこの glob の場合、ファイルに一致しない場合は何も拡張しないように glob に指示します。**/
: すべてのレベルのサブディレクトリ(/e...)
/
:ファイルタイプにのみ一致する別のglob修飾子目次とe{code}
一致するファイルパスワードtrueと確認されます(ファイルはに保存されます$REPLY
)。
D
隠しディレクトリを表示して隠しファイルを考慮するには、c
いくつかのglob修飾子を追加してください。
printf '%s\n' **/*(D/e{has Makefile}e{'has "*.c(#qD)"'})
GNUツールの使用:
LC_ALL=C find . \( -name '*.c' -o -name Makefile \) -print0 |
LC_ALL=C awk -v RS='\0' -v ORS='\0' '
{dirname = $0; sub("/[^/]*$", "", dirname)}
/\.c$/ {hasc[dirname]; next}
{hasMakefile[dirname]}
END {for (dir in hasc) if (dir in hasMakefile) print dir}' |
xargs -r0 ls
隠しディレクトリに入りたくないし、隠しCファイルに興味がない場合は、コマンドを次のfind
ように変更してください。
LC_ALL=C find . -name '.?*' -prune -o \( -name '*.c' -o -name Makefile \) -print0
これは一致するディレクトリのパスと内容を提供しますが、一致するディレクトリが1つしかない場合、そのls
パスは出力されません。パスをディレクトリと一致させたい場合は、に置き換えるls --
ことができます。printf '%s\n'