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- Nå 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
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
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
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
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.
ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"
END
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.
Sannheten er at du har stor kunnskap om linux-kommandoer. Veldig nyttig!
Ja, jeg vet at vi kommer til å lære mye med ham her hahaha.
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.
o:
for i i $ (ls -d /path/a/folder/*.ext); gjør KOMMANDO “$ i”; gjort;
Det ser bra ut, men hvis filnavnene inneholder blanke, fungerer det ikke. 🙂
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.
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.
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å.
Hvis du merker at $ i er anført. Det gjør unødvendig å rømme mellomrom.
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.
Veldig bra, kompleks, men veldig interessant.
dette er fantastisk, flott !!!!
Utmerket, plastisiteten til GNU / Linux har ingen grenser.
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