フォルダリストがありますが、ほとんどのフォルダ名がどのフォルダ名で始まるかを知りたいです。
次のフォルダのリストが与えられたら:
./
./.something
./unrelated
./Target.Dire ctoryName
./Target.Dire ctoryNameOther
./Target.Dire ctoryName.Other
./Target.Dire ctoryName.Stuff
./Target.Dire ctoryName.Stuff.Other
./Unrelated.Dire ctoryName
./Unrelated.Dire ctoryNameStuff
./Unrelated.Dire ctoryName.Stuff
./Unrelated.Dire ctoryName.Other
./More.Unrelated.Dire ctoryName
./More.Unrelated.Dire ctoryName.Other
./Target.Dire ctoryName
名前(スペースを含む)を知りたいです。
私はこれを思い出しましたが、隠されたフォルダを除いて非常に長く、「次へ開始」を実行せずに「インクルード」を実行します。
find * -maxdepth 0 -type d | xargs -d $'\n' sh -c \
'for arg do find * -maxdepth 0 -type d | grep -wo "$arg"; done' _ \
| sort | uniq -c | sort -nr | head -1 | echo "./$(awk '{print $2}')"
隠しフォルダがあるバージョンとないバージョンの2つのバージョンがあります。マイユースケースでは、find * -maxdepth 0 -type d
すべての潜在的なフォルダが含まれています。
フォルダ名が必要な理由は、私が使用するツールが特定のパラメータで使用されているときに「target / home」ディレクトリを特定できないためです。
ベストアンサー1
を使用すると、zsh
次のことができます。
all=(*(N/)) max=0 best=
for dir ($all) (){ (( $# > max )) && max=$# best=$dir; } ${(M)all:#$dir*}
print -r -- $max $best
*(N/)
タイプに拡張される非隠しファイル目次現在のディレクトリ(またはullglob修飾子と一致しない場合は何もありませんN
)。
${(M)all:#$dir*}
パターンに一致する配列要素に展開されます$all
。つまり、この値は匿名関数()に引数として渡され、最大値と比較されます。M
$dir*
$dir
(){....}
同じ状況が発生した場合は、語彙順にソートされたディレクトリのリストから最初のディレクトリを選択します(最後のディレクトリを取得するにはに>
置き換えます)。>=
隠しディレクトリを含めるには(常に除外するには)、glob修飾子()を追加しD
ます。dotglob
all=(*(ND/))
.
..
以下は元の答えです。要件をすばやく読みました。ディレクトリ自体の名前でなくても、そのディレクトリの最も一般的な共通プレフィックスを探します。たとえば、between、ab1
および代わりに次を返しab2
ab3
ます。bc
bc1
ab
bc
typeset -A c
for f (*(/)) for ((i=1;i<=$#f;i++)) ((c[\$f[1,i]]++))
printf -v argv '%2$08d%1$s' ${(kv)c}
print -r -- ${${(O)@}[1][9,-1]}
*(/)
タイプに拡張される非隠しファイル目次現在ディレクトリにあります(それ以外の場合はエラーで中断されます)。
次に、連想配列を構築して、$c
これらのディレクトリ名に対して可能な各プレフィックスの発生回数を記録します。
次に、発生数に基づいて配列を設定し、0から8桁まで入力し、$argv
各プレフィックスにプレフィックスを追加します。$@
その後、O
その配列を語彙の逆順に並べ替えるので、最初の配列が最も頻繁に発生する配列になり、同率があれば最後の配列が整列されます(最も長いプレフィックスも提供されます)。
次に、最初の文字()を選択し、[1]
最後の9番目の文字()を印刷します。[9,-1]
隠しディレクトリを含めるには(修飾子に追加)*(/)
に置き換えます。含まれていません。*(D/)
D
dotglob
.
..