コマンド「ls」でファイルとディレクトリを列挙する


11

ls現在のディレクトリでコマンドを実行し、出力を取得します。

$ ls
Applications Documents    Library      Music        Public
Desktop      Downloads    Movies       Pictures

私はそれらを次のように列挙したいと思います:

1. Applications
2. Desktop
3. Documents
4. Downloads
5. Library
6. Movies
7. Music
8. Pictures
9. Public

これはless中間的な方法で実現できます

ls | less -N

それらを簡単な方法で列挙する方法は?


これを常に発生させたいのですか、それとも時々発生させたいですか 最初のケースでは、回答のコマンドの1つにlsのエイリアスを作成できます。2番目では、コマンドに「lsn」と言う新しいエイリアスを作成します。
ジェームズクフ

回答:


16

または単純に:

ls -b |nl -s '. ' -w 1
1. a\ file\ with\ nonewline
2. a\ file\ with\nnewline
3. a\ file\ with\ space
4. afile

からman nl

-s, --number-separator=STRING
              add STRING after (possible) line number
-w, --number-width=NUMBER
              use NUMBER columns for line numbers

13

の出力lsを別のコマンドにパイプする必要があります。私の提案はawkこの方法で使用することです:

$ ls -b --group-directories-first | awk '{print NR ". " $0}'
1. dir1
2. dir2
3. dir3
4. z-dir1
5. z-dir2
6. z-dir3
7. file1
8. file2
9. file3
10. file4
11. file5
12. file6
13. file7
14. file\nnewline
  • ファイルの名前file\nnewlineに改行文字\nが含まれていることに注意してください。改行文字はオプションでエスケープされます-b

  • このオプション--group-directories-firstは、ファイルの前にディレクトリを出力します。

別の可能な方法はforループを使用することです(ただし、この場合、リストの先頭にディレクトリを配置することはより困難になります)。

n=1; for i in *; do echo $((n++)). $i; done

11

数字を表示するだけの場合、次のようないくつかのオプションとless -N方法があります。

$ ls |cat -n
$ ls |nl

出力番号をカスタマイズしたい場合はfind、印刷したいものを使用して実行することをお勧めします。

find . -exec bash -c 'for fnd; do printf "%d. %s\n" "$((++i))" "$fnd"; done ' _ {} +

POSIXly、あなたはするだろう:

find . -exec sh -c 'for fnd; do i=$((i+1)); printf "%d.\t%s\n" "$i" "$fnd"; done ' _ {} +

この場合、i事前に初期化する必要がありますi=0; find ...
。– rexkogitans

これは必ずしも-exec sh -c '....' 別のshシェルで実行されているため、必ずしもここではありません。
αғsнιη

3

短いBashスクリプトでこれを完全に行うこともできます。

#!/bin/bash
set -eu
shopt -s nullglob

[ "$#" -eq 0 ] || cd -- "$1"
i=0
for f in *; do
    printf '%d. %s\n' "$((++i))" "${f//$'\n'/^N}"
done |
cat -vt

9つ以上の結果を表示するために、空想に基づいて行番号を埋め込むこともできます。

#!/bin/bash
set -eu
shopt -s nullglob

[ "$#" -eq 0 ] || cd -- "$1"
ls=(*)
pad=${#ls[@]}
pad=${#pad}
i=0
for f in *; do
    printf '%*d. %s\n' "$pad" "$((++i))" "${f//$'\n'/^N}"
done |
cat -vt

使用法

numbered-ls.sh現在の作業ディレクトリに実行可能ファイルとしてスクリプトを保存したと仮定します。

./numbered-ls.sh [DIRECTORY]

引数DIRECTORYはオプションで、デフォルトは現在の作業ディレクトリです。

説明

  1. 引数付きでスクリプトが呼び出された場合、作業ディレクトリを最初の引数のパスに変更します。

  2. 現在の作業ディレクトリのすべてのエントリを照合し、それらを調べます。エントリごとにカウンタを増分し、エントリの名前とともにその値を出力します。エントリ名の改行文字はに置き換えられ^Nます。

  3. 出力をパイプcat -vt処理して、端末が制御文字として解釈する可能性のある印刷できない文字を含むファイル名を適切に処理します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.