最も低い番号のすべてのサブディレクトリを一覧表示しようとしています。
たとえば、次のリストの場合:
/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
仕組み:
for SUBDIR in $SUBDIRLIST
リストの各ディレクトリを見てください。リストは前の行で定義されています。 10を使用することを選択しましたか? 3文字の長さで10で始まる項目を選択してください。しかし、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を使用しますが、間違って実行するため、重複します。検索はデフォルトで項目をソートしません。
sort -n
次に、見つかった項目を並べ替え、-n
20が100より前になるように数字で処理します。
head -1
最初の行を除くすべてのアイテムをもう一度削除します。
最後に、SUBDIRLIST=10?
ステートメントは10で始まり、名前に3文字が含まれているサブディレクトリのみを選択します。必要に応じて制限できます。たとえば、SUBDIRLIST=*
Select Everythingは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番目のディレクトリの番号が異なる場合、このスクリプトは失敗します。