Sådan bruges kommandoer, der kun fungerer med en fil ad gangen med alle de filer, du vælger

Mange gange er vi nødt til at udføre et script for at konvertere en pdf til tekst, konvertere .doc-filer til html osv. pointen er, at disse kommandoer kun accepterer en fil ad gangen, og det er meget kedeligt, hvis vi har brug for at udføre den samme opgave på flere filer, især når vi laver et script.

Jeg foreslår en løsning på dette problem ved hjælp af ls, sed, grep, akavet y sh. Hvad vi vil gøre er at oprette den korrekte kommandolinje i hver række og udføre dem med sh, og da sh vil udføre en linje ad gangen, vil forbruget af RAM-hukommelse ikke øges, hvilket med andre metoder endda kan fryse understyrede maskiner.

Lad os se, hvordan du udfører denne kommandosekvens.

1- Den første ting, vi skal gøre, er at indtaste de filer, der skal bruges igennem ls:

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

2- Så har vi brug for disse filer for at videresende tilbud «/ sti / til gruppe af
filer«

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

3- Nu akavet det vil være klar til at modtage dataene.

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

fordi akavet har sit eget sprog, vi bliver nødt til at adskille de citater, som vi ønsker, skal vises for at citere en tekst blandt andre funktioner, vi skal bruge tilbageslag \ Lad os se, hvordan man adskiller nogle.
Adskil et tilbud

\”

Vis et tilbageslag i output (vi bliver nødt til at skrive tre søjler)

\\\

Nogle gange har vi brug for en isoleringsseparator, kun teksten eller citaterne, der vises inden for de to tilbageslag, vil blive output i output:

'""'\"\'""'

4- Lad os se, hvordan du omdøber alle de filer, der er anført ved hjælp af kommandoen mv bare for at indtaste et suffiks. (Nu for at liste filen, skal vi bruge kombinationen "$ 0", når vi har brug for den)

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

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

Bemærk tilføjes i slutningen som vist i forrige rækkefølge kombinationen « | sh »Hvilket omdirigerer rørledningen til denne kommandotolk

Lad os se nogle eksempler udarbejdet til at oprette et script.

Eksempler:

1- Konverter alle pdfs, der er anført i tekstfiler.

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

I dette tilfælde er det ikke nødvendigt at vælge en outputfil, da pdftotext automatisk genererer en tekstfil med basisnavnet og .txt-undtagelsen, hvis og kun hvis du arbejder med en enkelt fil.

2- Lad os sige, at vi vil anvende en effekt på et billede, men uden at ændre originalen, lad os se et eksempel med bølgeeffekten, der er kendt for Windows XP-logoet, da det er et flag med bølgede effekter (for bedre at værdsætte denne effekt er det anbefales at bruge det resulterende billede 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

Bemærk: Der foretages flere passeringer i denne rækkefølge:

  • En for at få den mappe, hvor filen er placeret med dirname
  • Et andet for at få basisnavnet, men fjernelse af filens udvidelse
  • En anden til at opnå undtagelsen for den nævnte fil.

3- Lad os nu se, hvordan man omdøber en gruppe filer ved at placere det tilsvarende nummer foran navnet (numerisk suffiks).

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

For at indtaste nummeret blev det interne awk-sprog brugt med indstillingen "FNR", der viser hver outputlinje, så antallet kan placeres før eller efter teksten.

Lad os se, hvordan man sætter et numerisk præfiks (sæt et nummer i slutningen, men inden undtagelsen) denne mulighed er kun 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- Lad os se et eksempel, hvor vi bliver nødt til at indtaste data eller vælge en gruppe af funktioner, idet vi tager et eksempel på det tilfælde, hvor vi fjerner adgangskodebeskyttelse fra flere pdf-filer, der har den samme adgangskode. (I dette tilfælde bruger vi 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

Afhængigt af versionen af ​​zenity kan indstillingen til adgangskoden være bare –pasword.

Som du så, er målet at lave en kat af en fil, der kun oprettes i begyndelsen af ​​linjen en gang og derefter slettes, når konverteringen er afsluttet.

5- Et andet værktøj er, når vi har brug for at pakke flere filer komprimeret i .zip

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

De ekstra tilbud skal adskilles med et mellemrum, hvor indstillingen "$ 0" bruges
Ejemplo
"unzip -x "$0" "

6- Lad os se et eksempel for at beskytte en pdf med en adgangskode, der tillader læsning, men beskyttet mod udskrivningskopi eller andre indstillinger (indstillingerne i dialogboksen er dem, der er tilladt i pdf, hvis du ikke vil tillade nogen af dem skal du ikke vælge nogen).

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 eksempler er det ganske eksemplificeret, hvordan man bruger denne mulighed til at konvertere, ændre eller omdøbe flere filer med et enkelt script og ikke konvertere dem manuelt en efter en. Hukommelsesforbruget med denne indstilling er minimalt afhængigt af den kommando, der bruges, da det ikke konverterer dem på samme tid, men den ene efter den anden.

Denne mulighed kan være meget nyttig, hvis vi vil konvertere en hel gruppe videoer med mencoder uden at denne sammenføjes til en; du kan forberede et script til dette, og de bliver bare nødt til at lægge det ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

FIN


Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.

  1.   Ramiro sagde han

    Ville det ikke være meget, men MYE lettere at gøre alt dette ved hjælp af regulære udtryk eller jokertegn? Jeg forstår ikke, hvad forskellen er mellem det og at gøre dit liv så kompliceret med dette.

  2.   crotus sagde han

    Sandheden er, at du har stor viden om linux-kommandoer. Meget brugbar!

    1.    KZKG ^ Gaara sagde han

      Ja, jeg ved, vi vil lære meget med ham her hahaha.

  3.   hexborg sagde han

    Jeg synes det er meget lettere:

    ls -d /path/to/folder/*.ext | mens læst fil; gør COMMAND "$ fil"; Færdig

    I stedet for COMMAND kan du placere, hvad du vil, og det fungerer, selvom filerne indeholder tomme mellemrum, så længe du sætter $-fil mellem anførselstegn. Du behøver ikke bruge sed til det eller generere kommandoer med awk. Dette lancerer også færre processer.

    1.    Ankh sagde han

      o:
      for i i $ (ls -d /path/a/folder/*.ext); gør KOMMANDO “$ i”; Færdig;

      1.    hexborg sagde han

        Det ser godt ud, men hvis filnavne indeholder blanke, virker det ikke. 🙂

        1.    tahed sagde han

          Faktisk er hexborg grunden til, at outputteksten er citeret i begyndelsen og i slutningen for hver linje med denne mulighed:
          ls – katalog | sed 's / ^ / »/' | sed 's / $ / »/'

          Jeg præciserer, at find kan bruges til at søge i underkatalogerne.

          1.    hexborg sagde han

            Men med mit trick behøver du ikke. ls tager de fulde filnavne ud en på hver linje og læser læser linje for linje og efterlader filnavnet i filvariablen, uanset om det har tomme mellemrum eller ej. Du skal bare sætte tilbud omkring $ -filen, når du bruger den i kommandoen.

          2.    Hugo sagde han

            Jeg er enig i, at det kan være mindre besværligt at finde ud af. Lad os tage dette eksempel fra artiklen:

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

            Det samme kunne godt opnås som dette, og det løber sandsynligvis hurtigere:

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

            Når det er sagt, er artiklen velkommen, det er altid godt at lære om alternative måder at gøre noget på.

        2.    Ankh sagde han

          Hvis du bemærker, er $ i anført. Det gør det unødvendigt at flygte mellemrum.

          1.    hexborg sagde han

            Ja, men $ () -operatøren udvider filnavne uden at sætte anførselstegn overalt, så variablen i fanger allerede navnene på de udskårne filer. Prøv det i en terminal i et bibliotek, der har filer med mellemrum i deres navne.

  4.   Leo sagde han

    Meget god, kompleks, men meget interessant.

  5.   helena_ryuu sagde han

    dette er fantastisk, fantastisk !!!!

  6.   MSX sagde han

    Fremragende, plasticiteten af ​​GNU / Linux har ingen grænser.

  7.   Natalia sagde han

    Kære blogger,

    Jeg er Natalia, kommunikationschef hos Paperblog. Efter at have opdaget det, kontakter jeg dig for at invitere dig til at kende Paperblog-projektet, http://es.paperblog.com, en ny borgerjournalistik. Paperblog er en digital platform, der ligesom et blogmagasin udgiver de bedste artikler om de registrerede blogs.

    Hvis konceptet interesserer dig, skal du kun foreslå din blog til at deltage. Artiklerne ledsages af dit navn / pseudonym og din profilfil samt flere links til den originale blog i begyndelsen og slutningen af ​​hver enkelt. De mest interessante kan vælges af holdet til at blive vist på forsiden, og du kan vælges som dagens forfatter.

    Jeg håber, du er motiveret af det projekt, som vi startede med en sådan begejstring i januar 2010. Se og tøv ikke med at skrive til mig for flere detaljer.

    Modtag en hjertelig og kærlig hilsen,
    Natalia