最も小さい番号のサブディレクトリを検索する

最も小さい番号のサブディレクトリを検索する

最も小さい番号を持つすべてのサブディレクトリをリストしようとしています。

たとえば、次のリストの場合:

/100/2001  
/100/2003  
/101/2001  
/101/2004  
/102/2000  
/102/2003  
/102/2005  

私が取得したいのは以下のみです:

/100/2001  
/101/2001  
/102/2000

答え1

各ディレクトリの最下位ディレクトリについては、各ディレクトリの出力を並べ替える必要があります。

/100/2001
/100/2003
/101/2001
/101/2004
/102/2000
/102/2003
/102/2005

ls コマンドはこれを自動的に実行しますが、デフォルトでは英数字でソートします。すべてのサブディレクトリの名前が同じ長さであれば、それで問題ありません。

SUBDIRLIST=10? for SUBDIR in $SUBDIRLIST do ls -d $SUBDIR/???? | head -1 done

仕組み: リスト内の各ディレクトリを調べます。リストは前の行で定義されています。長さが 3 文字で 10 で始まるエントリを選択するために 10? を使用するように選択しましたが、すべてを使用する場合は、for SUBDIR in $SUBDIRLIST
そう指定することもできます。SUBDIR=*

ls -d $SUBDIR/????

  • ls$SUBDIR の内容のソートされたエントリを表示するコマンド
  • ????4文字のエントリのみを選択します。気にしない場合は*を選択するか、無視するディレクトリが他にもある場合は、次のような式を使用してさらに制限します。20??

| head -1 - リストを「head コマンド」に渡します - head は最初の行のみを表示し、残りを破棄します。

すべてのディレクトリ名の長さが同じでない場合は、少し異なる解決策が必要になります。例:
SUBDIRLIST=10? for SUBDIR in $SUBDIRLIST do find $SUBDIR -depth 1 | sort -n | head -1 done

この場合、 ls はエントリをソートしますが、間違ったソートを行うため冗長であるため、 find を使用します。 find はエントリをソートしません (デフォルト)。

sort -n次に、見つかった項目を並べ替えます。項目-nが数値として扱われるようにし、20 が 100 より前に来るようにします。

もう一度、head -1最初の行以外のすべてを破棄します。

そして最後に、このSUBDIRLIST=10?ステートメントは、10 で始まり、名前が 3 文字であるサブディレクトリのみを選択します。必要に応じて、制限を増減できます。たとえば、SUBDIRLIST=*すべてを選択し、SUBDIRLIST=???3 文字のすべてのエントリを選択します。

答え2

これでうまくいくはずです:

ls -1d /*/200{0,1}

出力:

/100/2001
/101/2001
/102/2000

答え3

この入力は次のように実行できます:

awk -F/ 'min[$2]==0 { min[$2]=$3; next; }; 
 { if (min[$2]>$3) min[$1]=$3;}; 
 END {for (val in min) { print "/" val "/" min[val] };}'

awk最初のフィールドでソートします。これが保証されているのか、単なる偶然なのかはわかりません。確実にするには、awkの出力をパイプで

sort --field-separator=/ -n

答え4

このようなもの?

for firstdir in `ls .`; do
  seconddir=`ls -1 ./$firstdir | head -n 1`
  echo $firstdir/$seconddir
done

注意: このスクリプトは、2番目のディレクトリの数字が異なる場合に失敗します。

関連情報