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
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
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
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
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.
ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"
FIN
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.
Sandheden er, at du har stor viden om linux-kommandoer. Meget brugbar!
Ja, jeg ved, vi vil lære meget med ham her hahaha.
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.
o:
for i i $ (ls -d /path/a/folder/*.ext); gør KOMMANDO “$ i”; Færdig;
Det ser godt ud, men hvis filnavne indeholder blanke, virker det ikke. 🙂
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.
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.
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å.
Hvis du bemærker, er $ i anført. Det gør det unødvendigt at flygte mellemrum.
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.
Meget god, kompleks, men meget interessant.
dette er fantastisk, fantastisk !!!!
Fremragende, plasticiteten af GNU / Linux har ingen grænser.
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