これが標準出力ですls -ln | nl
wolf@linux:~$ ls -lh | nl
1 total 24
2 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
3 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
4 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
wolf@linux:~$
total 24
開始番号の代わりに2行目の実際のファイル/ディレクトリから始めることはできますか?
希望の出力
wolf@linux:~$ ls -lh | nl
total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
wolf@linux:~$
答え1
残りと一緒に最初の行を使用し、残りを次の行に渡します。nl
$ ls -lh | { sed -u q; nl; }
total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
sed
(バッファリングを無効にするために使用されます-u
)ラインとq
uitを消費し、終了する前に暗黙的にラインを印刷します。nl
残りのラインを消費します。
最初の行をインデントするには、次のようにします。
$ ls -lh | { sed -u 's/^/ /;q'; nl; }
total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
行番号付けをさらに開始するには、終了sed
時点を教えてください。q
$ ls -alh | { sed -u 's/^/ /;3q'; nl; }
total 24
drwx------ 1 wolf wolf 186 Sep 24 22:18 .
drwx------ 1 wolf wolf 186 Sep 24 22:18 ..
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
/\.\.$/q
代わりに同様のものを使用することもできます3q
。
答え2
これはnl
ゼロから始まります。
$ ls -lh | nl -v 0
0 total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
答え3
少し醜いですが、少なくともGNU Coreutilsの実装では、正規表現nl
で番号を付ける行を指定できます。長いリスト出力で可能なファイル形式の1つでt
はないからです。ls
1あなたはできます
ls -lh | nl -bp'^[^t]'
残念ながら、これは出力ソートを維持しません。
おそらく最も正式に正しい方法は、ls
出力を別々のヘッダーと本文部分に分割することです。
$ ls -lh | sed -e '1s/.*/\\:\\:\\:\n&\n\\:\\:/' | nl
total 0
1 -rw-rw-rw- 1 steeldriver steeldriver 0 Sep 9 19:53 bar
2 -rw-r--r-- 1 steeldriver steeldriver 449 Sep 16 17:41 bash_envs
3 -rw-rw-rw- 1 steeldriver steeldriver 131 Sep 5 18:13 dirlist
4 -rw-r--r-- 1 steeldriver steeldriver 359 Sep 13 19:42 error_status
(基本的にタイトル番号付けスタイルは次のとおりです。まったく)。
答え4
awk
代わりに、次のことを試すことができます。
ls -lh | awk '{printf("%5s ",NR==1?" ":NR-1); print}'
これにより、番号付けされていない「フル」行が印刷され、フィールド幅が5の数字を含む残りのすべての行が右に調整されて印刷されます。数字と行の内容の間のスペースは2つのスペースです(フォーマット5s
文字列の次のテキスト)printf()
。\t
「合計」行が必要ない場合は、次のものを使用できます。
ls -lh | awk 'NR>1{print (NR-1) "\t" $0}'
または
ls -lh | awk 'NR>1 {printf("%5s ",NR-1); print}'
代わりに。