同じ文字列で始まるフォルダを探す

同じ文字列で始まるフォルダを探す

私のフォルダの1つには1000を超えるサブディレクトリがあります。そのうちのいくつかは同じ文字列で始まり、名前の最初の5文字が別のディレクトリの最初の5文字であるすべてのディレクトリを探したいと思います。

特定の文字列を検索したくありません。最初のサブディレクトリの名前を読み、それを他のサブディレクトリ名の最初の5文字と比較する方法が必要です。その後、2番目のサブディレクトリなどのプロセスを繰り返す必要があります。

見つかった名前はすべてテキストファイルに書き込む必要があります。

答え1

以下のコマンドは目的の操作を実行します。

find . -maxdepth 1 -type d | sort | uniq -D -w 7

find現在のディレクトリのすべてのディレクトリを一覧表示してフィルタリングし、sort(前提条件を使用)比較のために最初の7文字だけを使用してすべての重複エントリを印刷します。最初の2文字になるため、5文字ではなく7文字を使用してください。uniquniq./

答え2

パラメータ拡張を使用して、文字列の最初の5文字を​​確認できます。

ソートされたディレクトリ名を繰り返すだけです。同じプレフィックスを持つディレクトリは、これらのリストに隣接する必要があります。

$keep異なるプレフィックスを持つ最初のディレクトリを含めることは、同じプレフィックスを持つ複数のディレクトリがある場合に複数の印刷を$printed防ぐために使用されるフラグです。$keep

#! /bin/bash
printed=0
keep=''
for dir in */ ; do
    if [[ ${dir:0:5} == ${keep:0:5} ]] ; then
        if ((!printed)) ; then
            echo "$keep"
            printed=1
        fi
        echo "$dir"
    else
        printed=0
        keep=$dir
    fi
done

答え3

ディレクトリ名にスペースが含まれていない場合は、次のことができます。

find . -type d -printf '%f\n' | 
    perl -lne '/.{1,5}/; push @{$k{$&}},$_; 
               END{ 
                    map{print if scalar(@{$k{$_}})>1}keys(%k)
               }' > results.txt

これは現在のディレクトリのすべてのサブディレクトリを見つけて名前を印刷します(サポートしていると-printf '%f\n'仮定)。スクリプトは各名前の最初の5文字を​​取得し、値がディレクトリ名の配列ハッシュのキーとして使用されます。その後、複数回見つかった名前が印刷されます。findprintfperl

ディレクトリ名に改行を含めることができる場合は、BEGIN{$/="\0"}Perlスクリプトの先頭にADを追加できます。

find . -type d -printf '%f\0' | 
    perl -lne 'BEGIN{$/="\0"} /.{1,5}/; push @{$k{$&}},$_; 
               END{
                 map{print if scalar(@{$k{$_}})>1}keys(%k)
               }' > results.txt

答え4

すべての提案と公開されたソリューションに感謝します!結局使ったfind . - maxdepth 1 -type d -print0 | sort -z | uniq -zD -w 7 | tr '\0' '\n'

出力は正しいアルファベット順に表示されませんが、「重複」が隣接して表示されます。これがより重要なことです。ここで多くを学びました。 (もう一度:-)

関連情報