Hvordan bruke kommandoer som bare fungerer med en fil om gangen med alle filene du velger

Mange ganger må vi kjøre et skript for å konvertere en pdf til tekst, konvertere .doc-filer til html, etc; poenget er at disse kommandoene bare godtar en fil om gangen, og det er veldig kjedelig for oss hvis vi trenger å utføre den samme oppgaven på flere filer, spesielt når vi gjør et skript.

Jeg foreslår en løsning for dette problemet ved hjelp av ls, tørste, grep, awk y sh. Det vi skal gjøre er å lage riktig kommandolinje i hver rad og utføre dem med sh, og siden sh vil utføre en linje om gangen, vil ikke forbruket av RAM-minne øke, noe som med andre metoder til og med kan fryse underdrevne maskiner.

La oss se hvordan du utfører denne kommandosekvensen.

1- Det første vi må gjøre er å introdusere filene som skal brukes gjennom ls:

ls --directory /camino/a/carpeta/*.ext

2- Da trenger vi disse filene for å sende tilbud «/ sti / til gruppe på
filer«

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/'

3-awk den vil være klar til å motta dataene.

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print $0}'

fordi awk har sitt eget språk, vi trenger å skille sitatene som vi ønsker skal vises for å sitere en tekst blant andre funksjoner vi trenger for å bruke tilbakeslag \ La oss se hvordan vi kan skille noen.
Separat et tilbud

\”

Vis en tilbakeslag i utgangen (vi må skrive tre stolper)

\\\

Noen ganger trenger vi en isolerende skilletegn, bare teksten eller anførselstegnene som vises i de to tilbakeslagene skrives ut i utdataene:

'""'\"\'""'

4- La oss se hvordan du kan gi nytt navn til alle filene som er oppført ved hjelp av kommandoen mv bare for å legge inn et suffiks. (Nå for å liste opp filen må vi bruke kombinasjonen "$ 0" når vi trenger å bruke den)

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print "mv "$0" \"`dirname

"$ 0 ″" / Text-any-`basename "$ 0 ″" \ ""} '| sh

Merk er lagt til på slutten som vist i forrige sekvens kombinasjonen « | sh »Som omdirigerer rørledningen til denne kommandotolken

La oss se noen eksempler forberedt på å lage et skript.

eksempler:

1- Konverter alle pdfs som er oppført i tekstfiler.

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh

I dette tilfellet er det ikke nødvendig å velge en utdatafil siden pdftotext automatisk genererer en tekstfil med basisnavnet og .txt-unntaket hvis og bare hvis du jobber med en enkelt fil.

2- La oss si at vi vil bruke en effekt på et bilde, men uten å endre originalen, la oss se et eksempel med bølgeeffekten som er kjent for Windows XP-logoen, siden det er et flagg med bølgete effekter (for å bedre sette pris på denne effekten er det anbefales å bruke det resulterende bildet med filtypen .png).

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="convert -wave 25x150

"$0"","\"\`dirname "$0"`/`basename "$0" | sed '"'"s/\\\\.[[:alnum:]]*$//"'"'`-wave.`basename "$0" |
rev | awk -F . \'"'"'\{print $1}\'"'"'\ | rev`'""'\"\'""' "}' | sh

Merk: flere passeringer blir gjort i denne sekvensen:

  • En for å få mappen der filen ligger med dirname
  • En annen for å skaffe grunnnavnet, men fjerne utvidelsen av filen
  • En annen for å få fritak for filen.

3- La oss nå se hvordan du endrer navn på en gruppe filer ved å plassere det tilsvarende tallet foran navnet (numerisk suffiks).

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" '""'\"\'""'`dirname
"$0"`/"FNR"-`basename "$0"`'""'\"\'""' "}' | sh

For å legge inn nummeret ble det interne awk-språket brukt med alternativet "FNR" som viser hver linje med utdata, slik at tallet kan plasseres før eller etter teksten.

La oss se hvordan vi setter et numerisk prefiks (setter et nummer på slutten, men før unntaket) dette alternativet er bare gyldig hvis filen har en.

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" \"`dirname
"$0"`/`basename "$0" | sed '\'s/\\\\.[[:alnum:]]*$//\''`-"FNR".`echo "$0" | rev | awk -F .
'""'\'\'""'{print $1}'""'\'\'""' | rev `\" " }' | sh

4- La oss se et eksempel der vi må legge inn data eller velge en gruppe funksjoner, og ta et eksempel på tilfellet der vi fjerner passordbeskyttelse fra flere pdf-filer som har samme passord. (I dette tilfellet vil vi bruke zenity som en dialogboks)

zenity --entry --hide-text --text "introduzca la clave de desbloqueo" > $HOME/.cat && ls
--directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="pdftk "$0" input_pw `cat
$HOME/.cat` output \"`dirname "$0"`/`basename "$0" .pdf`-unlock.pdf\" "}' | sh && rm
$HOME/.cat

Avhengig av versjonen av zenity kan passordalternativet bare være –passord.

Som du så, er målet å lage en katt av en fil som vil bli opprettet i begynnelsen av linjen bare en gang, og deretter vil den bli slettet når konverteringen er fullført.

5- Et annet verktøy er når vi trenger å pakke ut flere filer komprimert i .zip

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "unzip -x "$0" "}' | sh

De ekstra sitatene må skilles med et mellomrom der alternativet "$ 0" brukes.
Ejemplo
"unzip -x "$0" "

6- La oss se et eksempel for å beskytte en pdf med et passord, som tillater lesing, men beskyttet mot utskrift av kopier eller andre alternativer (alternativene som er oppført i dialogboksen vil være de som vil være tillatt i pdf, hvis du ikke vil tillate noen av dem, ikke velg noen).

zenity --separator " " --multiple --text "Seleccione los Opciones que quiere permitir" --column "Opciones" --list "Printing" "DegradedPrinting" "ModifyContents" "CopyContents" "ScreenReaders" "ModifyAnnotations" "AllFeatures" > $HOME/.cat && zenity --entry --hidetext --text "Teclee la contraseña de protección" > $HOME/.cat2 && ls --directory "$@" | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="echo \"pdftk \\\"`echo "$0"`\\\" output \\\"`dirname "$0"`/`basename "$0" .pdf`-locked.pdf\\\" allow `cat $HOME/.cat` owner_pw \"`cat $HOME/.cat2`\"\" | sh "}' | sh && rm $HOME/.cat $HOME/.cat2

Med disse eksemplene er det ganske eksemplifisert hvordan du bruker dette alternativet til å konvertere, endre eller gi nytt navn til flere filer med ett enkelt skript og ikke konvertere dem for hånd en etter en. Minneforbruket med dette alternativet er minimalt, avhengig av kommandoen som brukes, siden det ikke konverterer dem samtidig, men etter hverandre.

Dette alternativet kan være veldig nyttig hvis vi vil konvertere en hel gruppe videoer med mencoder uten at denne blir med i en; du kan forberede et skript for dette, og de må bare sette ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

END


Legg igjen kommentaren

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Kontroller SPAM, kommentaradministrasjon.
  3. Legitimering: Ditt samtykke
  4. Kommunikasjon av dataene: Dataene vil ikke bli kommunisert til tredjeparter bortsett fra ved juridisk forpliktelse.
  5. Datalagring: Database vert for Occentus Networks (EU)
  6. Rettigheter: Når som helst kan du begrense, gjenopprette og slette informasjonen din.

  1.   Ramiro sa

    Ville det ikke vært mye, men MYE lettere å gjøre alt dette ved å bruke vanlige uttrykk eller jokertegn? Jeg forstår ikke hva som er forskjellen på det og å gjøre livet ditt så komplisert med dette.

  2.   crotus sa

    Sannheten er at du har stor kunnskap om linux-kommandoer. Veldig nyttig!

    1.    KZKG ^ Gaara sa

      Ja, jeg vet at vi kommer til å lære mye med ham her hahaha.

  3.   hexborg sa

    Jeg tror dette er mye lettere:

    ls -d /path/to/folder/*.ext | mens du leser filen; gjør COMMAND "$ file"; ferdig

    I stedet for COMMAND kan du sette hva du vil, og det fungerer selv om filene inneholder tomme mellomrom så lenge du legger $ file mellom anførselstegn. Du trenger ikke å bruke sed til det eller generere kommandoene med awk. Dette lanserer også færre prosesser.

    1.    Ankh sa

      o:
      for i i $ (ls -d /path/a/folder/*.ext); gjør KOMMANDO “$ i”; gjort;

      1.    hexborg sa

        Det ser bra ut, men hvis filnavnene inneholder blanke, fungerer det ikke. 🙂

        1.    tahed sa

          Faktisk er hexborg grunnen til at utgangsteksten siteres i begynnelsen og slutten for hver linje med dette alternativet:
          ls –katalog | sed 's / ^ / »/' | sed 's / $ / »/'

          Jeg presiserer at finne kan brukes til å søke i underkatalogene.

          1.    hexborg sa

            Men med trikset mitt trenger du ikke. Det tar de fulle navnene på filene en på hver linje og leser leser linje for linje og etterlater filnavnet i filvariabelen, enten det har tomme mellomrom eller ikke. Du trenger bare å sette anførselstegn rundt $ file når du bruker den i kommandoen.

          2.    Hugo sa

            Jeg er enig i at det kan være mindre tungvint å finne. La oss ta dette eksemplet fra artikkelen:

            ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh

            Det samme kan godt oppnås slik, og det går sannsynligvis raskere:

            find . -type f -print0 | xargs -0 pdftotext

            Når det er sagt, er artikkelen velkommen, det er alltid bra å lære om alternative måter å gjøre noe på.

        2.    Ankh sa

          Hvis du merker at $ i er anført. Det gjør unødvendig å rømme mellomrom.

          1.    hexborg sa

            Ja, men $ () -operatøren utvider filnavnene uten å sette anførselstegn hvor som helst, så variabelen i fanger allerede navnene på de kutte filene. Prøv det i en terminal i en katalog som har filer med mellomrom i navnene.

  4.   Leo sa

    Veldig bra, kompleks, men veldig interessant.

  5.   Helena_ryuu sa

    dette er fantastisk, flott !!!!

  6.   MSX sa

    Utmerket, plastisiteten til GNU / Linux har ingen grenser.

  7.   Natalia sa

    Kjære blogger,

    Jeg er Natalia, kommunikasjonssjef i Paperblog. Etter å ha oppdaget det, tar jeg kontakt med deg for å invitere deg til å kjenne Paperblog-prosjektet, http://es.paperblog.com, en ny statsborgerjournalistjeneste. Paperblog er en digital plattform som, i likhet med et bloggmagasin, publiserer de beste artiklene på de registrerte bloggene.

    Hvis konseptet interesserer deg, trenger du bare å foreslå at bloggen din skal delta. Artiklene vil bli ledsaget av ditt navn / pseudonym og profilfil, samt flere lenker til den opprinnelige bloggen, i begynnelsen og på slutten av hver enkelt. De mest interessante kan velges av teamet for å vises på forsiden, og du kan velges som dagens forfatter.

    Jeg håper du er motivert av prosjektet som vi startet med en slik entusiasme i januar 2010. Ta en titt og ikke nøl med å skrive til meg for mer informasjon.

    Motta en hjertelig og kjærlig hilsen,
    Natalia