私のフォルダの1つには1000を超えるサブディレクトリがあります。そのうちのいくつかは同じ文字列で始まり、名前の最初の5文字が別のディレクトリの最初の5文字であるすべてのディレクトリを探したいと思います。
特定の文字列を検索したくありません。最初のサブディレクトリの名前を読み、それを他のサブディレクトリ名の最初の5文字と比較する方法が必要です。その後、2番目のサブディレクトリなどのプロセスを繰り返す必要があります。
見つかった名前はすべてテキストファイルに書き込む必要があります。
答え1
以下のコマンドは目的の操作を実行します。
find . -maxdepth 1 -type d | sort | uniq -D -w 7
find
現在のディレクトリのすべてのディレクトリを一覧表示してフィルタリングし、sort
(前提条件を使用)比較のために最初の7文字だけを使用してすべての重複エントリを印刷します。最初の2文字になるため、5文字ではなく7文字を使用してください。uniq
uniq
./
答え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文字を取得し、値がディレクトリ名の配列ハッシュのキーとして使用されます。その後、複数回見つかった名前が印刷されます。find
printf
perl
ディレクトリ名に改行を含めることができる場合は、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'
出力は正しいアルファベット順に表示されませんが、「重複」が隣接して表示されます。これがより重要なことです。ここで多くを学びました。 (もう一度:-)