Jak wykonać echo tylko 1 kolumny danych wyjściowych z polecenia ls?


54

Powiedzmy, że kiedy wykonam polecenie ls, wynikiem jest:

file1 file2 file3 file4

Czy można wyświetlić tylko określoną kolumnę wyników, w tym przypadku plik2? Próbowałem następujących bezskutecznie:

echo ls | $2

Zasadniczo wszystko, co chcę zrobić, to echo tylko drugiej kolumny, w tym przypadku chcę echo:

file2

2
Jaka jest sytuacja, w której naprawdę chcesz kolumnę z lswyjściem?
michas,

11
Zasadniczo nigdy nie powinieneś analizować ls . Prawie zawsze istnieją lepsze sposoby na uzyskanie potrzebnych informacji.
terdon

Nie zrobiłbym tego nieznajomy: P (przepraszam, że zawsze podobało mi się to zdanie) liczba kolumn zależy od nazw plików i folderów, więc druga kolumna może być tą, której chcesz, lub nie, lub może znajdować się w jednym lsi po utworzeniu niektórych plików / folderów może nie być już tym, czego chcesz. Jak zauważył terdon, na pewno są lepsze sposoby na zdobycie tego, czego chcesz
YoMismo,

Odpowiedzi:


81

Następujące polecenie sformatuje dane wyjściowe ls w jednej kolumnie

ls -1 /directory

2
Ale to nie daje ci tylko jednej kolumny, którą interesuje się OP.
Anthon

1
Aby poprawić: ls -1 /directory | head -2 | tail -1lubls -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz

@KWubbufetowicz ls | sed -n '1p;q'wydaje się prostszy
Fiximan

3
Odpowiedzi szukałem, ale nie na pytanie OP.
Michael Lang

36

Szukasz tego:

ls -C | awk '{ print $2 }'

Jednak zakładając, że spróbujesz użyć tej nazwy pliku później, nie rób tego, ponieważ spowoduje to uszkodzenie nazw plików zawierających białe znaki. Zamiast tego umieść pliki w tablicy i pobierz drugi, co pozwoli uniknąć w ogóle parsowania:

files=(*)
printf '%s\n' "${files[1]}"

Kolejność odzyskiwania plików zależy od wartości LC_COLLATE. Jako taki, możesz chcieć ustawić LC_COLLATE=Cnajpierw, jeśli chcesz „standardowe” sortowanie we wszystkich przypadkach narożnych.


Zauważ, że indeksy tablic zaczynają się od 1w rozsądnych powłokach (zsh, yash, fish, csh, tcsh, rc, es ...) i od 0w ksh i bash. Aby uzyskać rozwiązanie przenośne dla wszystkich powłok podobnych do Bourne'a, możesz użyć: set -- *; printf '%s\n' "$2"zamiast.
Stéphane Chazelas

@ StéphaneChazelas Przynajmniej w przypadku tego pytania tagi zawierają „bash”, więc ta odpowiedź jest specyficzna dla tej powłoki.
Chris Down

ls -C | awk „{print $ 1} look daje taki sam wynik ... dlaczego 2 $?
boctulus

7

Trzeba dodać, -Cponieważ lsużywa trybu jednokolumnowego, gdy wyjście nie jest terminalem. awknastępnie drukuje drugą kolumnę:

ls -C | awk '{print $2}'

2

Myślę, że szukasz

ls -1

Nie będzie wyświetlać uprawnień, właściciela, grupy, daty, rozmiaru ... ale prostą nazwę pliku w pojedynczej kolumnie.


1
Ta odpowiedź jest nie tylko błędna, ale została już podana.
Scott

Chociaż zdaję sobie sprawę, że to jest złe w pierwotnym pytaniu, tego właśnie szukałem. Więc dziękuję.
AntumDeluge,

0

Jedynym sposobem, który działa dla mnie, jest dodanie „-all”. To jest:

ls -C -all | awk '{ print $1 }'

Ponieważ -alldodaj więcej kolumn, takich jak użytkownik, uprawnienia itp.


0

Jak już wspomniano - używanie kolumn do analizowania lsdanych wyjściowych nie jest bardzo niezawodne, ponieważ lsłamie linie zgodnie z długością nazw plików i szerokością terminali. Często interesujące jest wyświetlenie pojedynczej kolumny listy elementów. Możesz to zrobić za pomocą polecenia cut:

echo file1 file2 file3 file4 | cut -d" "  -f2

wyświetli się

file2

Zauważ, że -dpozwala wybrać separator kolumny, więc na przykład za pomocą

cur -d, -f2

możesz wyświetlić drugą kolumnę listy oddzielonej przecinkami.


0

Załóżmy, że jeśli chcesz wyświetlić tylko konkretną nazwę pliku w bieżącej ścieżce, użyj polecenia poniżej

Komenda:

find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"

0

Jest to trudne, ponieważ parsowanie ls -Czależy od:

  1. długość nazwy pliku (która sama zależy od określonej listy plików przekazanej ls -C)
  2. szerokość terminala.
  3. fakt, że ls -Cdane wyjściowe są kolumnowe, ale mogą być skonfigurowane do zmiennej liczby spacji jako separatorów pól.
  4. możliwość spacji w nazwach plików (których wyświetlanie zależy od lswybranych wybranych opcji wyświetlania).

Na razie zacznijmy od prostszego problemu ( tj. Nie nr 4 powyżej), zakładając , że w nazwach plików nie ma białych znaków . Aby wydrukować kolumnę nr 2, działa to:

COLUMNS=$COLUMNS ls -C | tr -s ' ' '\t' | cut -f2

Rozwijanie tego:

  • COLUMNS=$COLUMNSgwarantuje, że podawana długość kolumny | pozostaje spójna z bieżącym wyświetlaczem terminala. Zmiana ta do dowolnej wartości działa zbyt, więc COLUMNS=50albo COLUMNS=70 spowodowałoby ls -Czmienić rzeczy według tych szerokościach.

    Inną metodą byłoby użycie -wprzełącznika, np . :

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • trzapewnia spójność separatorów pól: pojedyncza karta między każdą kolumną.

  • cut wyświetla żądaną kolumnę.



-1
num_chars=54 # offset
ls -ltr | cut -c$num_chars-

w razie potrzeby zmień liczbę znaków (54), aby uzyskać tylko te dane, które chcesz.


2
dla wyjaśnienia, używając 54-tells cut na każdą postać zaczynającą się na pozycji 54; nie kończy się na kolumnie „rozpoznany przez człowieka”
Jeff Schaller

To nie jest zły pomysł ... po prostu trzeba go ulepszyć.
prusswan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.