Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: jarmala - 28.09.23 - klo:22.09
-
Ls:n tulosteessa tiedostojen yhteiskokohan tulostuu heti alkuun, mutta mukavampaa olisi, että se tulisi vasta lopussa, jolloin se jäisi ruudulla näkyviin.
Netistä löytyy pilvin pimein erilaisia vaihtoehtoja, mutta kaikkia ovat hieman kryptisiä. Päädyin kuitenkin seuraavaan:
myfunction() { ls -alFh "$1"; ls -alFh "$1" | head -1; }
Ja se tulostaa hienosti:
$ myfunction ../tmp/
total 16K
drwxrwxr-x 2 ari ari 4,0K syys 28 21:41 ./
drwxr-x--- 32 ari ari 4,0K syys 28 21:42 ../
-rw-rw-r-- 1 ari ari 196 syys 28 21:41 bar
-rw-rw-r-- 1 ari ari 148 syys 28 21:41 foo
total 16K
Mutta se ei toimi parametrien suhteen samalla tapaa kuin ls, koska jos komentaa
ari@ari-JL:~/tmp$ myfunction
ls: cannot access '': No such file or directory
ls: cannot access '': No such file or directory
a
ri@ari-JL:~/tmp$ myfunction *
-rw-rw-r-- 1 ari ari 196 syys 28 21:41 bar
-rw-rw-r-- 1 ari ari 196 syys 28 21:41 bar
ari@ari-JL:~/tmp$ myfunction ./*
-rw-rw-r-- 1 ari ari 196 syys 28 21:41 ./bar
-rw-rw-r-- 1 ari ari 196 syys 28 21:41 ./bar
Millä tavalla te siirtäisitte sen totalin tulosteen loppuun?
-
Ls:n tulosteessa tiedostojen yhteiskokohan tulostuu heti alkuun, mutta mukavampaa olisi, että se tulisi vasta lopussa, jolloin se jäisi ruudulla näkyviin.
Netistä löytyy pilvin pimein erilaisia vaihtoehtoja, mutta kaikkia ovat hieman kryptisiä. Päädyin kuitenkin seuraavaan:
myfunction() { ls -alFh "$1"; ls -alFh "$1" | head -1; }
Mutta se ei toimi parametrien suhteen samalla tapaa kuin ls
Vaihda komennossa $1:n tilalle $@
-
Vaihda komennossa $1:n tilalle $@
Ok, kokeillaan:
ari@ari-JL:~/tmp$ myfunction() { ls -alFh "$@"; ls -alFh "$@" | head -1; }
ari@ari-JL:~/tmp$ myfunction
total 16K
drwxrwxr-x 2 ari ari 4,0K syys 28 21:41 ./
drwxr-x--- 32 ari ari 4,0K syys 28 21:42 ../
-rw-rw-r-- 1 ari ari 196 syys 28 21:41 bar
-rw-rw-r-- 1 ari ari 148 syys 28 21:41 foo
total 16K
ari@ari-JL:~/tmp$ myfunction *
-rw-rw-r-- 1 ari ari 196 syys 28 21:41 bar
-rw-rw-r-- 1 ari ari 148 syys 28 21:41 foo
-rw-rw-r-- 1 ari ari 196 syys 28 21:41 bar
ari@ari-JL:~/tmp$ myfunction ./*
-rw-rw-r-- 1 ari ari 196 syys 28 21:41 ./bar
-rw-rw-r-- 1 ari ari 148 syys 28 21:41 ./foo
-rw-rw-r-- 1 ari ari 196 syys 28 21:41 ./bar
OK, tuo auttaa pelkkkään myfunctioniin, mutta ei juuri muihin... No, on sekin hyvä, kiitos siitä. Tänks.
-
ari@ari-JL:~/tmp$ myfunction() { ls -alFh "$@"; ls -alFh "$@" | head -1; }
OK, tuo auttaa pelkkkään myfunctioniin, mutta ei juuri muihin... No, on sekin hyvä, kiitos siitä. Tänks.
Ainiin, olisiko jotain keinoa, jotta hakemistoa ei tarvitsisi lukea kahteen kertaan?
-
Ei siitä taida selvitä ilman AWKia tai vastaavaa. Tässä AWK-ratkaisu:
ls -alFh "$@" | gawk -f koe.awk
Missä koe.awk (suomenkieliselle ls-komentotulosteelle tuunattuna, vaihda ”yhteensä” sanaksi ”total” jos käytät lontoota):
/^yhteensä/ {
total = $0
}
!/^yhteensä/ {
print
}
END {
print total
}
-
Ei siitä taida selvitä ilman AWKia tai vastaavaa. Tässä AWK-ratkaisu:
Jippii!
-
Jippii!
Tuosta kommentista voisi jopa päätellä ratkaisun kelpaavan, joten jos on näin, niin lisäisitkö ketjun ensimmäiseen säikeen otsikkoon "Ratkaistu:"-teksti.
-
Ei siitä taida selvitä ilman AWKia tai vastaavaa. Tässä AWK-ratkaisu:
ls -alFh "$@" | gawk -f koe.awk
Enpä kehtaa vielä merkitä tätä ratkaistuksi, koska tuo komento ei toimi, jos sen kohdistaa muihin hakemistoihin:
$ alias lg='ls -Fltrh "$@" | gawk -f ~/koe.awk'
ari@ari-JL:~$ lg
drwxrwxr-x 2 ari ari 4,0K tammi 28 2023 data/
drwxr-xr-x 2 ari ari 4,0K tammi 28 2023 Videot/
drwxr-xr-x 2 ari ari 4,0K tammi 28 2023 Musiikki/
drwxr-xr-x 2 ari ari 4,0K tammi 28 2023 Mallit/
drwxr-xr-x 2 ari ari 4,0K tammi 28 2023 Julkinen/
drwxr-xr-x 2 ari ari 4,0K helmi 7 2023 Työpöytä/
drwxr-xr-x 2 ari ari 4,0K helmi 7 2023 Kuvat/
-rw-rw-r-- 1 ari ari 78 syys 30 01:14 koe.awk
drwxrwxr-x 3 ari ari 4,0K loka 19 02:16 avi/
total 244K
ari@ari-JL:~$ lg avi/
gawk: warning: command line argument `avi/' is a directory: skipped
ari@ari-JL:~$ lg ./avi/
gawk: warning: command line argument `./avi/' is a directory: skipped
Eh? Mitä se gawkille kuuluu, mikä komentorivin parametri on? Käsittelisi vaan sen, mitä sille putkesta syötetään...
-
$ alias lg='ls -Fltrh "$@" | gawk -f ~/koe.awk'
ari@ari-JL:~$ lg avi/
gawk: warning: command line argument `avi/' is a directory: skipped
Eh? Mitä se gawkille kuuluu, mikä komentorivin parametri on? Käsittelisi vaan sen, mitä sille putkesta syötetään...
Muuttujat kuten "$@" eivät toimi aliaksen sisällä. Sen sijaan alias korvataan suoraan määrittelemälläsi tekstillä täydentämättä muuttujia, ja parametrit lisätään perään. Komennoksi tulee siis käytännössä:
ls -Fltrh "$@" | gawk -f ~/koe.awk avi/
Tee aliaksen sijaan funktio (https://stackoverflow.com/a/7131683) tai erillinen skripti, jonka voit tallentaa esimerkiksi .local/bin-hakemistoon. Tässä esimerkki .bashrc-tiedostoon sijoitettavasta funktiosta:
lg() {
ls -Fltrh "$@" | gawk '/^yhteensä/ {total = $0} !/^yhteensä/ {print} END {print total}'
}
-
Tee aliaksen sijaan funktio (https://stackoverflow.com/a/7131683) tai erillinen skripti, jonka voit tallentaa esimerkiksi .local/bin-hakemistoon. Tässä esimerkki .bashrc-tiedostoon sijoitettavasta funktiosta:
lg() {
ls -Fltrh "$@" | gawk '/^yhteensä/ {total = $0} !/^yhteensä/ {print} END {print total}'
}
No nyt se alkoi toimia, kun vielä hoksasi vaihtaa yhteensät totaleiksi.
Kiitos.
-
lg() {
ls -Fltrh "$@" | gawk '/^yhteensä/ {total = $0} !/^yhteensä/ {print} END {print total}'
}
Perunpa puheeni: tuo toimii vain komentoriviltä ajettuna, mutta .bashrc:hen lisättynä se ei toimi edes buutin jälkeen: command not found... Mikäs tässä nyt vielä hangoittaa?
-
Perunpa puheeni: tuo toimii vain komentoriviltä ajettuna, mutta .bashrc:hen lisättynä se ei toimi edes buutin jälkeen: command not found... Mikäs tässä nyt vielä hangoittaa?
Ahaa, ne funktiot pitääkin lisätä tiedostoon /etc/bash.bashrc. Nyt alkaa näyttää lupaavammalta. Kokeilenpa tätä jonkin aikaa...
-
Perunpa puheeni: tuo toimii vain komentoriviltä ajettuna, mutta .bashrc:hen lisättynä se ei toimi edes buutin jälkeen: command not found... Mikäs tässä nyt vielä hangoittaa?
Kuulostaa siltä, että käyttäjän .bashrc:ssä on jotain muuta vikaa, tai että sitä ei edes ladata .profile-tiedostossa.
Muutokset voi aina testata käynnistämällä uuden bash-istunnon:
bash
Sulje istunto Ctrl+D:llä tai exit-komennolla.