Chcę iterować po każdym wierszu w danych wyjściowych: ls -l /some/dir/*
Teraz próbuję: for x in $(ls -l $1); do echo $x; done
Jednak to iteruje po każdym elemencie w linii osobno, więc otrzymuję:
-r--r-----
1
ivanevf
eng
1074
Apr
22
13:07
File1
-r--r-----
1
ivanevf
eng
1074
Apr
22
13:17
File2
Ale chcę powtórzyć każdą linię jako całość. W jaki sposób mogę to zrobić?
Odpowiedzi:
Ustaw IFS na nowy wiersz, na przykład:
Umieść wokół niego podpowłokę, jeśli nie chcesz ustawiać IFS na stałe:
Lub użyj while | czytaj zamiast tego:
Jeszcze jedna opcja, która uruchamia while / read na tym samym poziomie powłoki:
źródło
read -r
bo inaczej bash usunie z danych niezaciągane odwrotne ukośniki.To zależy, co chcesz zrobić z każdą linią. awk jest użytecznym narzędziem do tego typu przetwarzania. Przykład:
.. w moim systemie wyświetla nazwę i rozmiar każdej pozycji w katalogu.
źródło
Jak już wspomniano, awk jest do tego odpowiednim narzędziem. Jeśli nie chcesz używać awk, zamiast analizować wyjście „ls -l” wiersz po wierszu, możesz iterować po wszystkich plikach i wykonać „ls -l” dla każdego pojedynczego pliku w następujący sposób:
źródło
Możesz także wypróbować
find
polecenie. Jeśli chcesz tylko pliki w bieżącym katalogu:Uruchomić polecenie na każdym z nich?
Policz linie, ale tylko w plikach?
źródło
Narzędzie read (1) wraz z przekierowaniem wyjścia polecenia ls (1) zrobi, co chcesz.
źródło
Dlaczego więc nikt nie zasugerował po prostu użycia opcji eliminujących części, których nie chce przetwarzać.
Na nowoczesnym Debianie po prostu otrzymujesz plik z:
Co więcej, nie musisz zwracać uwagi na to, w jakim katalogu go uruchomisz, jeśli używasz pełnego katalogu:
To ostatnie polecenie używam powyższego i otrzymuję następujący wynik:
źródło