Wylicz pliki i katalogi za pomocą polecenia „ls”

11

Uruchom polecenie lsw bieżącym katalogu i uzyskaj dane wyjściowe:

$ ls
Applications Documents    Library      Music        Public
Desktop      Downloads    Movies       Pictures

Chciałbym wymienić je w następujący sposób:

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

Można to osiągnąć wykorzystując lessw sposób pośredni

ls | less -N

Jak wymienić je w prosty sposób?

Rachunek różniczkowy
źródło
Czy chcesz, aby zawsze tak się działo, czy tylko czasami? W pierwszym przypadku możesz utworzyć alias ls do jednego z poleceń w odpowiedziach; w drugim utwórz nowy alias - powiedz „lsn” do polecenia.
jamesqf

Odpowiedzi:

16

Lub po prostu wykonaj:

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

z man nl:

-s, --number-separator=STRING
              add STRING after (possible) line number
-w, --number-width=NUMBER
              use NUMBER columns for line numbers
αғsнιη
źródło
13

Powinieneś przesłać dane wyjściowe lsdo innego polecenia. Moją sugestią jest użycie awkw ten sposób :

$ 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
  • Należy pamiętać, że plik file\nnewlinezawiera znak nowej linii \nw nazwie, który jest zastępowany przez opcję -b.

  • opcja --group-directories-firstwyświetli katalogi przed plikami.

Innym możliwym sposobem jest użycie pętli (ale w tym przypadku umieszczenie katalogów na początku listy będzie trudniejsze):

n=1; for i in *; do echo $((n++)). $i; done
pa4080
źródło
11

jeśli po prostu pokazuje liczbę, masz kilka opcji, jak poniżej less -N:

$ ls |cat -n
$ ls |nl

Jeśli chcesz niestandardową numerację wyjściową, sugerowałbym użycie findi robienie wszystkiego, co chcesz wydrukować:

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

POSIXly zrobiłbyś:

find . -exec sh -c 'for fnd; do i=$((i+1)); printf "%d.\t%s\n" "$i" "$fnd"; done ' _ {} +
αғsнιη
źródło
W takim przypadku inależy wcześniej zainicjować:i=0; find ...
rexkogitans
to niekoniecznie tutaj, ponieważ -exec sh -c '....' działa pod osobną powłoką sh.
αғsнιη
3

Możesz to zrobić w całości za pomocą krótkiego skryptu 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

Możesz nawet być fantazyjny i wpisać numer wiersza, aby uzyskać więcej niż 9 wyników:

#!/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

Stosowanie

Zakładając, że zapisałeś skrypt jako plik wykonywalny numbered-ls.shw bieżącym katalogu roboczym:

./numbered-ls.sh [DIRECTORY]

Argument DIRECTORYjest opcjonalny i domyślnie przyjmuje bieżący katalog roboczy.

Wyjaśnienie

  1. Jeśli skrypt został wywołany z argumentem, zmień katalog roboczy na ścieżkę w pierwszym argumencie.

  2. Dopasuj wszystkie wpisy bieżącego katalogu roboczego i przejrzyj je. Dla każdego wpisu zwiększ licznik i wydrukuj jego wartość wraz z nazwą wpisu. Znaki podziału linii w nazwie wpisu są zastępowane przez ^N.

  3. Przepływaj dane wyjściowe, cat -vtaby uporać się z nazwami plików zawierającymi znaki niedrukowalne, które terminal może interpretować jako znaki sterujące.

David Foerster
źródło