Joney Skrevet 13. september 2010 Del Skrevet 13. september 2010 Hei, jeg er totalt nybegynner i linux og skulle gjerne hatt et eksempel på oppgaven jeg jobber med: Lag et shellscript som lagrer innholdet av en katalog i en fil på disken. Noen som gidder å lage et eksempel for meg? Takker på forhånd! -Joney Lenke til kommentar
mikeys Skrevet 13. september 2010 Del Skrevet 13. september 2010 (endret) ls > katalog less katalog Prøv det og se om det er det du er ute etter. Hvis du vil ha noe annet kan du gjøre man ls for å prøve ut forskjellige flagg, som feks. "ls -l" Du kan også sjekke ut denne siden. Det er ikke veldig vanskelig å lære seg enkel bash scripting. EDIT: Hva er det egentlig du skal bruke dette til? Endret 13. september 2010 av mikeys 1 Lenke til kommentar
Sokkalf™ Skrevet 13. september 2010 Del Skrevet 13. september 2010 Skal du lagre innholdet i katalogen til en fil, som i en zip-fil, eller skal du bare ha en liste med navn på filene i katalogen? Lenke til kommentar
mathias123 Skrevet 15. september 2010 Del Skrevet 15. september 2010 Lister ut filnavn (en fil per linje) #!/bin/sh ls -l > /home/mittbrukernavn/output Skal du ha _innholdet_: #!/bin/sh for fil in $(ls) do cat fil >> /home/mittbrukernavn/innhold_i_alle_filer done Lenke til kommentar
Beritaron Skrevet 17. september 2010 Del Skrevet 17. september 2010 (endret) Bare for å forklare litt av det mikeys sier. Hadde tenkt å bruke det i en artikkel, men vet ikke om det blir noe av. Like greit om noen andre kan få nytte av den i mellomtiden Det er hovedsaklig de som går under > som vil være av interesse. Den er også et godt stykke fra hva jeg anser som ferdig (både innhold og grammatiske feil), men håper den vil være forklarende og enkel og forstå Har stort sett også kopiert og limt fra HTML-tekst, så riktig formatering er det heller ikke. Oversikt kommando ; kommando - Semikolon fullfører en og en kommando etter hverandre kommando && kommando - Dobbel-& fullfører kommando etter tur med kriteriet at forrige kommando gikk smertefritt. kommando | kommando - Piper sender første kommando igjennom neste kommando > fil - Sender kommandoen til en fil kommando >> fil - Legger resultetet av kommandoen til et tidligere lagret resultat kommando 2> fil - Legger til feilmeldinger til fil kommando 2>> fil - Legger feilmeldinger til et tidligere lagret resultat kommando > fil1 2> fil2 - Lager to filer, en med resultat og en med feilmeldinger kommando > fil 2>&1 - Sender resultat og feilmeldinger til samme fil For de som ønsker å prøve Dere som ønsker å prøve kommandoene mens dere leser burde åpne Terminal (Applications > Accessories > Terminal) og lage en testmappe i hjemmeområdet (som vil være standard sted når du åpner Terminal) og gå til denne på følgende måte: user@user-laptop:~$ mkdir testmappe && cd testmappe Alle kommandoer som vises vil være uthevet så de er lette å finne frem til. Nederst i artikkelen viser vi også et par mer praktiske kommandoer enn de som vises i eksemplene. En annen kommando som kan komme til nytte for å se hva som ligger i en tekstfil uten at man må åpne en teksteditor som Gedit eller nano, kan kommandoen cat være god å ha, vi kommer også til å bruke denne kommandoen for å vise enkelte resultater. user@user-laptop:~$ cat navnpaaenfil.txt Her vises teksten i filen navnpaaenfil.txt user@user-laptop:~$ Noen av eksemplene er kun for å vise, og ikke alltid like praktisk i praksis. For eksempel om du skal lage flere mapper som vist under kan du fint gjøre dette med: user@user-laptop:~$ mkdir mappe1 mappe2 mappe3 … isteden for å bruke mkdir for å opprette hver mappe. kommando ; kommando Denne kommandoen fullfører enkelt og greit en og en kommando på tur uavhengig av hva utfallet på første kommando er. For å vise ett mindre meningsfullt eksempel kun for å vise dette kan vi prøve å lage to mapper: user@user-laptop:~/testmappe$ mkdr mappe1 ; mkdir mappe2 No command 'mkdr' found, did you mean: Command 'mkdir' from package 'coreutils' (main) mkdr: command not found Som vi ser her har vi skrevet den første kommandoen feil, og får spørsmål om vi mente mkdir. Uten å stoppe opp her gikk den allikevel videre til neste kommando og lagde mappe2, vi bruker kommandoen ls for å vise innhold i mappen: user@user-laptop:~/testmappe$ ls mappe2 user@user-laptop:~/testmappe$ kommando && kommando Denne kommandoen går ikke videre til neste kommando med mindre første kommando var vellykket. Vi kan bruke samme eksempel her: user@user-laptop:~/testmappe$ mkdr mappe3 && mkdir mappe4 No command 'mkdr' found, did you mean: Command 'mkdir' from package 'coreutils' (main) mkdr: command not found user@user-laptop:~/testmappe$ ls mappe2 user@user-laptop:~/testmappe$ Som vi ser ble ikke mappe4 opprettet på grunn av feilmeldingen som oppstod ved første kommando, om vi skriver kommandoen riktig derimot: user@user-laptop:~/testmappe$ mkdir mappe3 && mkdir mappe4 user@user-laptop:~/testmappe$ ls mappe2 mappe3 mappe4 user@user-laptop:~/testmappe$ … vil vi se at ingen feilmeldinger vises, og begge mappene er opprettet. kommando | kommando De som ønsker å prøve følgende kommando i dette eksempelet burde først lage en rekke filer i testmappen (om dere ikke vet om noen andre mapper dere har mange filer i), dette kan enkelt gjøres med følgende kommando: user@user-laptop:~/testmappe$ touch fil{1..250}.txt user@user-laptop:~/testmappe$ Det vi nå har gjort er å lage 250 tomme tekstfiler i testmappen med navn fil1, fil2, fil3 … opp til fil250. Om vi nå hadde kjørt kommandoen ls med opsjonen -l for å vise mer informasjon om hver fil, vil nok de aller fleste ikke få plass til alle filene i vinduet. I terminalen er kanskje ikke dette så stort problem da man enkelt har mulighet til å rulle opp og ned for å se alt som har skjedd i Terminal. Om du derimot ikke jobber i et miljø der du har et grensesnitt (GUI), men kun tekstbasert (CLI), vil du nok ha stor nytte for denne kommandoen. Vi kommer ikke til å vise resultatet av kommandoen her da den blir nokså lang, men dere kan selv prøve å skrive følgende kommando: user@user-laptop:~/testmappe$ ls -l | less user@user-laptop:~/testmappe$ Kommandoen blir nå sendt og vist gjennom less. Her kan du bruke piltastene opp og ned for å bla opp og ned en fil, eller page up og page down for å bla en side av gangen. For å komme ut av less trykker du på tastaturknappen q, og du er tilbake kommandofeltet. For å slette alle filene igjen kan følgende kommando brukes: user@user-laptop:~$ rm fil{1..250}.txt kommando > fil Denne kommandoen kan være veldig nyttig i en rekke tilfeller. Det denne kommandoen gjør er å sende resultatet til et annet sted enn vinduet du sitter å skriver kommandoen i. Som regel blir denne kommandoen brukt for å sende resultatet til en tekst-fil, men kan også sendes andre steder, som for eksempel en printer. Vi prøver nå å sende ls (som gir oversikt over hva som befinner seg i mappen du er i) til en tekstfil: user@user-laptop:~/testmappe$ ls > innhold.txt user@user-laptop:~/testmappe$ ls innhold.txt mappe2 mappe3 mappe4 user@user-laptop:~/testmappe$ cat innhold.txt mappe2 mappe3 mappe4 user@user-laptop:~/testmappe$ Vi ser at første kommando ikke viste innholdet i mappen i vinduet slik den ellers har gjort, og når vi kjører ls på nytt ser vi at en ny fil med navnet og filtypen vi skrev inn i første kommando er opprettet. Om vi åpner dette filen vil vi se hva som ville vært resultatet av kommandoen ls som vist under i terminalen (bare før innhold.txt ble opprettet, så filen innhold.txt vil ikke vises i resultatet på tekstfilen). Om du bruker navnet på en allerede eksisterende fil i mappen vil denne bli overskrevet! kommando >> fil Noen ganger kan det være greit å legge til et resultat i en allerede eksisterende fil, det gjøres på samme måte som som over, det eneste du må huske på er en ekstra >, og bruke navnet på en allerede eksisterende fil du ønsker å skrive resultatet til. user@user-laptop:~/testmappe$ ls >> innhold.txt user@user-laptop:~/testmappe$ ls innhold.txt mappe2 mappe3 mappe4 user@user-laptop:~/testmappe$ Om vi kun hadde brukt en > hadde filen blitt skrevet over, men nå har resultatet av ls lagt til filen innhold.txt. kommando 2> fil Når du får tilbakemeldinger fra kommandoer blir dette gitt fra to forskjellige steder, du har en strøm for standard tilbakemeldinger, og en for feilmeldinger. Å sende disse til fil gjøres på samme måte som å sende vanlig resultat til fil, men du må bruke 2 for > for å henvise til strømmen for feilmeldinger. user@user-laptop:~/testmappe$ ls fakefil -l > output.txt ls: cannot access fakefil: No such file or directory user@user-laptop:~/testmappe$ cat output.txt user@user-laptop:~/testmappe$ ls fakefil -l 2> output.txt user@user-laptop:~/testmappe$ cat output.txt ls: cannot access fakefil: No such file or directory user@user-laptop:~/testmappe$ Det første jeg gjør her er å prøve og gjøre kommandoen ls på en fil som ikke eksisterer, noe som fører til feilmelding. output.txt-filen vil bli opprettet, men den vil da være tom som kommandoen cat viser. Jeg kjører deretter kommandoen på nytt med 2 før >, vi ser ingen feilmeldinger, og cat-kommandoen viser at feilmeldinger er lagret i output.txt-filen. kommando 2>> fil I eksemplet over så skrev jeg over den tomme output.txt-filen (eller en hvilken som helst allerede eksisterende fil), men om jeg heller skulle legge det til i den tomme filen så måtte jeg brukt to >-er. user@user-laptop:~/testmappe$ ls fakefil2 -l 2>> output.txt user@user-laptop:~/testmappe$ cat output.txt ls: cannot access fakefil: No such file or directory ls: cannot access fakefil2: No such file or directory user@user-laptop:~/testmappe$ Her prøver jeg å bruke ls på nok en fil som ikke eksisterer, men som cat viser, blir dette resultatet lagt til i den eksisterende filen. kommando > fil1 2> fil2 Om vi ønsker å lagre både resultat og feilmeldinger kan det gjøres slik: user@user-laptop:~/testmappe$ ls mappe4 mappe5 > stdout 2> stderr user@user-laptop:~/testmappe$ cat stdout mappe4: user@user-laptop:~/testmappe$ cat stderr ls: cannot access mappe5: No such file or directory user@user-laptop:~/testmappe$ Her blir resultatet lagret i en fil kalt stdout, og feilmeldinger lagret i en fil kalt stderr. Du kan selvfølgelig også kombinere doble >-er om du ønsker å legge til meldingene i allerede eksisterende dokumenter. kommando > fil 2>&1 For å lagre begge meldinger i en fil bruker 2>&1 etter i samme kommando etter å ha skrevet hvilken fil meldingene skal skrives til. user@user-laptop:~/testmappe$ ls mappe4 mappe5 > begge 2>&1 user@user-laptop:~/testmappe$ cat begge ls: cannot access mappe5: No such file or directory mappe4: user@user-laptop:~/testmappe$ Om du ønsker å sende resultat og feilmelding til samme eksisterende fil gjøres dette ved å bruke doble >-er før navn på fil, men bare en > når du skal henvise til at også feilmdinger skal skrives til denne filen: user@user-laptop:~/testmappe$ ls mappe4 mappe5 >> begge 2>&1 user@user-laptop:~/testmappe$ cat begge ls: cannot access mappe5: No such file or directory mappe4: ls: cannot access mappe5: No such file or directory mappe4: user@user-laptop:~/testmappe$ Endret 18. september 2010 av tamarin 1 Lenke til kommentar
Beritaron Skrevet 18. september 2010 Del Skrevet 18. september 2010 (endret) Om du er totalt nybegynner så kan jeg forklare litt av hvordan et script er satt opp. Er ikke noen avansert Bash-scripter, så andre kan sikkert utdype litt. Et eksempel med forklaringer under: #!/bin/bash # Script som lister innhold i mappe til /home/user/logs/filoversikt.txt # Her kan du skrive inn kommandoen du ønsker å bruke #! = shebang eller crunchbang, disse tegnene indikerer filen som et script. /bin/bash = er stien til skallet, i dette tilfellet et som er kjørbart i Bash (Bourne-again shell). Den øverste linjen er alltid med for å fortelle at det er et script og for at scriptet skal vise stien til skallet som benyttes. # info = er tekst som blir oversett av skriptet (# etterfulgt av et mellomrom og tekst), dette kan være greit for å forklare hva skriptet gjør. For at skriptet skal bli kjørbart må du fortelle skallet at det er en kjørbar fil, chmod som bruker til å gi forskjellige rettigheter brukes her. I eksempelet under taes det utgangspunkt i at listfiles er navnet på filen som inneholder scriptet og at du befinner deg i samme mappe: ~$ chmod u+x listfiles Deretter kjøre kommandoen med: ~$ ./listfiles Her er et eksempel på hvordan det hele gjøres via kommandolinjen om det er ønskelig: For de som ønsker å se en liten tutorial fra start til slutt kan dere følge denne: user@user-laptop:~$ nano # nano er en teksteditor for terminalen user@user-laptop:~$ cat filliste.sh # cat lister hvordan filen filliste.sh ser ut #!/bin/bash # Liste over filer i /home/user/download ls -l /home/user/Downloads >> /home/user/logs/filliste.txt # Skriv uthevet tekst når du er i nano, husk å endre user (eventuelt mapper) til tilsvarende på din maskin. # For å gå ut, trykk Ctrl+X trykk Y, deretter skriv navnet (filliste.sh i eksempel), # deretter enter for å lagre. user@user-laptop:~$ chmod u+x filliste.sh # chmod endrer rettirheter på fil # u+x gir brukeren rettigheter til å kjøre scriptet, kan også bruke +x # filliste.sh er filen endringene skal gjelde for user@user-laptop:~$ mkdir logs # Mapper blir ikke lagret automatisk, så om du ikke har mappen du laget sti til må den lages, # mkdir oppretter nye mapper, navn som følger etter kommando er navn på mappen som opprettes. user@user-laptop:~$ ./filliste.sh # Kommando for å kjøre skriptet. # ./ brukes som snarvei for å fortelle at du er i samme mappe som scriptet. # Om du ikke er i samme mappe må du fortelle stien til scriptet user@user-laptop:~$ cat ./logs/filliste.txt total 0 user@user-laptop:~$ ./filliste.sh user@user-laptop:~$ cat ./logs/filliste.txt total 0 total 8 -rw-r--r-- 1 user user 7330 2010-09-19 00:18 logo1w.png user@user-laptop:~$ ./filliste.sh user@user-laptop:~$ cat ./logs/filliste.txt total 0 total 8 -rw-r--r-- 1 user user 7330 2010-09-19 00:18 logo1w.png total 68 -rw-r--r-- 1 user user 58982 2010-09-19 00:20 g700.jpg -rw-r--r-- 1 user user 7330 2010-09-19 00:18 logo1w.png # Her har jeg kjørt scriptet et par ganger hvor jeg har gjort endringer med filer i mappen. user@user-laptop:~$ For å gjøre det hele mer oversiktelig så du får med dato på når du har kjørt scriptet så kan du legge til en linje før eller etter utifra hvor du vil datoen skal vises, scriptet er allerede gjort kjørbart, så det holder å kun lagre endringene: #!/bin/bash # Liste over filer i /home/user/download date >> /home/user/logs/filliste.txt # Legger til dato på filliste ls -l /home/user/Downloads >> /home/user/logs/filliste.txt # Lager liste over i Downloads-mappen eller #!/bin/bash # Liste over filer i /home/user/download date >> /home/user/logs/filliste.txt && ls -l /home/user/Downloads >> /home/user/logs/filliste.txt For å se forskjellige kommandoer som blir brukt til å sende resultater til fil, se innlegg over. For å se andre mulige visninger for listing av filer, bruk kommandoen "man ls" eller "info ls" i terminalen. Endret 18. september 2010 av tamarin Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå