Powinienem powtarzać tylko nazwy plików lub katalogów o tej konstrukcji:
ls -Al | while read string
do
...
done
ls -Al
wynik :
drwxr-xr-x 12 s162103 studs 12 march 28 12:49 personal domain
drwxr-xr-x 2 s162103 studs 3 march 28 22:32 public_html
drwxr-xr-x 7 s162103 studs 8 march 28 13:59 WebApplication1
Na przykład, jeśli spróbuję:
ls -Al | while read string
do
echo "$string" | awk '{print $9}
done
następnie wypisuj tylko pliki i katalogi bez spacji. Jeśli plik lub katalog ma spacje takie jak „domena osobista”, będzie to tylko słowo „osobisty”.
Potrzebuję bardzo prostego rozwiązania. Może jest lepsze rozwiązanie niż awk.
linux
command-line
ls
Alex Zern
źródło
źródło
ls -Al *' '*
? Wynik parsowanials
nigdy nie prowadzi do niczego dobrego.ls -Al | while
. Prostym i bardziej niezawodnym sposobem jestfor string in *; do echo "$string"; done
.ls
? Analizals
i „działa w całości * nix i nie zepsuje się, jeśli coś się stanie”, nie idą dobrze razem.Odpowiedzi:
Ty naprawdę nie powinien analizować dane wyjściowe
ls
. Jeśli jest to zadanie domowe i wymaga tego Twój profesor, nie wie o czym mówi. Dlaczego nie zrobisz czegoś takiego:Dobry ...
lub
...Źli...
Jeśli naprawdę chcesz używać
ls
, możesz uczynić go trochę bardziej niezawodnym, wykonując coś takiego:... i brzydkie
Jeśli nalegasz , aby zrobić to w niewłaściwy, niebezpieczny sposób i po prostu musisz użyć
while
pętli, wykonaj następujące czynności:Poważnie, ale nie rób tego.
źródło
drwx------ 2 s162103 studs 3 oct. 9 2012 .ssh drwxr-xr-x 3 s162103 studs 6 oct. 25 09:02 .subversion drwxrwxrwt 3 s162103 studs 3 nov. 15 2012 .TempoItems
czasami mam randkę bez czasu, tylko rok ils
.-l
przełącznik? Jeśli wszystko czego potrzebujesz to nazwy plików, po prostu uruchomls -A
. Używanie-l
tylko utrudnia życie, ponieważ teraz trzeba przeanalizować wyniki.ls
to po prostu nie najlepszy sposób na uzyskanie tego, czego potrzebujesz. Dlaczego nie opublikujesz nowego pytania wyjaśniającego informacje, które chcesz zebrać, a my możemy zasugerować, jak to zrobić. Alternatywnie możesz użyć skryptu w obecnej postaci i skorzystać z jednej z powyższych sugestii, aby wydrukować tylko nazwę. Ale poważnie, nie analizujls
, po prostu powiedz nam dokładnie, co próbujesz zrobić w nowym pytaniu.Czy jest jakiś powód, dla którego
ls -A1
* nie działa?Na przykład:
* Uwaga: to wielka litera A i numer jeden.
źródło
Zastanawiam się, dlaczego nikt nie wspomniał o tym prostym poleceniu:
źródło
sort
potokowanie powoduje, że blok wielokolumnowy jest niepodzielny na jedną kolumnę?ls
powraca dols -1
(wyjście z pojedynczą kolumną), gdy jego wyjście nie trafia do terminala (i wyłącza cytowanie / zamianę niedrukowalnych znaków; @Kusalananda, jeślils
nie jest zgodne z POSIX, jeśli nadal tak jest).ls
dane wyjściowe są już posortowane. Więc potokowanie go dosort
co najwyżej nic nie zrobi, a co gorsza zniekształci dane wyjściowe (jeśli nazwy plików zawierają znaki nowego wiersza) lub zawiedzie dla nazw plików, które nie są tekstem.ls -a | cat
byłoby lepiej. Lub nawet lepiej,ls -A1
jak już wspomniano (i ponieważ generalnie chceszls
zachowuje się inaczej, gdy wyjście nie jest terminalem.Nie można przeanalizować wyniku
ls
, nie mówiąc już o tym,ls -l
ponieważ znak nowej linii, podobnie jak spacja, jest tak samo poprawnym znakiem, jak każdy znak w nazwie pliku. Musisz także wziąć pod uwagę dowiązania symboliczne, które mają dane wyjściowe podobne... foo -> bar
.Dlaczego miałbyś użyć
-l
mimo wszystko, jeśli chcesz tylko nazwę pliku?Po prostu zrób:
Jeśli chcesz dołączyć pliki kropek (oprócz
.
i..
), w zależności od powłoki:zsh
:bash
:ksh93
:POSIXly:
źródło
Co powiesz na:
źródło
skompresuj wiele spacji do pojedynczych spacji za pomocą tr, a następnie możesz użyć wycięcia do podziału na polach
źródło
Spróbuj (
bash
,zsh
,ksh93
składnia):Zobacz też:
ls
? w unix SEźródło
spróbuj
ls -1
Thats Integer 1Ze strony podręcznika.
źródło
wyświetla jakie pliki w jakim katalogu.
źródło