最も小さい番号を持つすべてのサブディレクトリをリストしようとしています。
たとえば、次のリストの場合:
/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番目のディレクトリの数字が異なる場合に失敗します。