Moltes vegades necessitem executar un script ja sigui per convertir un PDF en text, convertir els fitxers .doc en html, etc; la qüestió és que aquests comandaments només accepten un fitxer a la vegada i això ens resulta molt tediós si necessitem realitzar la mateixa tasca a diversos arxius sobre tot el que vam fer un script.
Jo els proposo una solució per a aquest problema utilitzant ls, set, grep, awk y sh. El que farem serà crear la línia d'ordres correcta en cada fila i executar-les amb sh, i com sh executés una linea alhora no s'augmentés el consum de memòria ram que amb altres mètodes poden fins congelar a les màquines de poca potència.
Vegem com fer realitzar aquesta seqüència d'ordres.
1- El primer que hem de fer serà introduir els fitxers que es fessin servir mitjançant ls:
ls --directory /camino/a/carpeta/*.ext
2- Després necessitarem que aquests fitxers passin encomillados «/ Camí / a grup de
fitxers«
ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/'
3- Ara awk estarà llest per rebre les dades.
ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print $0}'
A causa que awk té el seu propi llenguatge necessitarem separar les cometes que vulguem que surtin per encomillar un text entre altres funcions necessitarem utilitzar la barra invertida \ vegem com separar algunes.
Separar una cometa
\”
Mostra una barra invertida en la sortida (necessitarem teclejar tres barres)
\\\
Algunes vegades necessitarem un separador aïllador, només sortirà a la sortida el text o les cometes que apareguin dins les dues barres invertides .:
'""'\"\'""'
4- Vegem com canviar el nom tots els fitxers que es llistin utilitzant la comanda mv només per introduir un sufix. (Ara per llistar el fitxer necessitarem farà servir la combinació «$ 0» sempre que necessitem usar-la)
ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print "mv "$0" \"`dirname
«$ 0" `/ Text-qualsevol-`basename« $ 0 "` \ »«} '| sh
Nota se li afegeix a la fin com es mostra en l'anterior seqüència la combinació « | sh »Que redirigeix la canonada a aquest interpreti d'ordres
Vegem alguns exemples preparats per crear un script.
Exemples:
1- Convertir tots els pdf que es llistin en fitxers de text.
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh
2- Diguem que volem aplicar un efecte a una imatge però sense modificar l'original, vegem un exemple amb l'efecte wave molt conegut pel logotip de Windows XP, ja que es tracta d'una bandera amb efectes oondulados (per apreciar millor aquest efecte es recomana usar com imatge resultant l'extensió .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
Nota: en aquesta seqüència es realitzen diverses passades:
- Una per obtenir la carpeta on es troba el fitxer amb dirname
- Una altra per obtenir el nom base, però eliminant l'extensió d'aquest fitxer
- Una altra per obtenir l'exempció d'aquest fitxer.
3- Vegem ara com reanomenar un grup de fitxers posant-li el número corresponent davant de el nom (sufix numèric).
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" '""'\"\'""'`dirname
"$0"`/"FNR"-`basename "$0"`'""'\"\'""' "}' | sh
Vegem com posar un prefix numèric (posar un número a al final, però abans de l'exempció) aquesta opció només és vàlida si l'arxiu té una extensió.
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- Vegem un exemple on haurem d'introduir dades o seleccionar un grup de funcions prenent com a exemple el cas on li traiem la protecció per contrasenya a diversos fitxers de pdf que tenen la mateixa clau. (En aquest cas farem servir zenity com caixa de diàleg)
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
Com van veure l'objectiu és fer un cat d'un fitxer que es creés a el principi de la línia un sol cop i després serà eliminat un cop s'acabi la conversió.
5- Una altra utilitat és, quan necessitem descomprimir diversos fitxers compactat en .zip
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "unzip -x "$0" "}' | sh
Exemple
"unzip -x "$0" "
6- Vegem un exemple per protegir un pdf amb contrasenya permetent la lectura però protegit contra la còpia impressió o altres opcions, (les opcions que es llistin a la caixa de diàleg seran les que es permetran al pdf, si no vol permetre cap d'elles no seleccioni cap).
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
Amb aquests exemples queda prou exemplificat com fer servir aquesta opció per convertir, modificar o canviar el nom diversos arxius amb una sola seqüència de comandaments i no convertint-los a mà un per un. El consum de memòria amb aquesta opció és mínim, en dependència de la comanda que aquest fent servir, ja que no els converteix el mateix temps sinó un darrere l'l'altre.
ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"
FI
No seria molt, però MOLTÍSSIM més fàcil fer tot això usant expressions regulars o comodins? No entenc quina és la diferència entre això i complicar tant la vida amb això.
La veritat tahed, tenes gran coneixement de les ordres de linux. Molt útil!
Sí, sé que aprendrem molt amb ell per aquí hahaha.
Crec que això és molt més fàcil:
ls -d /camino/a/carpeta/*.ext | while read file; do COMANDO «$ file»; done
En lloc de COMANDO pots posar el que vulguis i funciona encara que els fitxers continguin espais en blanc sempre que posis $ file entre cometes. No cal utilitzar set per això ni generar els comandaments amb awk. A més això llança menys processos.
o:
for i in $ (ls -d /camino/a/carpeta/*.ext); do COMANDO "$ i"; done;
Això té bona pinta, però si els noms dels fitxers contenen espais en blanc no funciona. 🙂
De fet hexborg per això és que es encomilla el text de sortida a l'inici i al final per cada línia amb aquesta opció:
ls -directory | set 's / ^ / »/' | set 's / $ / »/'
Aclareixo que es pot usar find perquè busqui en els subdirectoris.
Però amb el meu truc no cal. ls treu els noms complets dels fitxers un a cada línia i read llegeix línia a línia i deixa el nom de el fitxer en la variable file tant si té espais en blanc o no. Només cal posar cometes al voltant de $ file a l'usar-lo en la comanda.
Estic d'acord que en find pot ser menys molest. Prenguem aquest exemple de l'article:
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh
Bé podria aconseguir-se el mateix així, i probablement s'executi més ràpid:
find . -type f -print0 | xargs -0 pdftotext
Dit això, l'article és benvingut, sempre és bo conèixer maneres alternatives de fer alguna cosa.
Si et fixes les $ i està entre cometes. Això fa innecessari escapar els espais en blanc.
Si, però l'operador $ () expandeix els noms de fitxer sense posar cometes en cap lloc, així que la variable i ja s'agafa els noms dels fitxers tallats. Prova-ho en una terminal en un directori que tingui fitxers amb espais en els noms.
Molt bo, complex, però molt interessant.
això és al·lucinant, bonissim !!!!
Excel·lent, la plasticitat de GNU / Linux no té límits.
Benvolgut blogger,
Sóc Natalia, Cap de Comunicació de Paperblog. Després haver-ho descobert, em poso en contacte amb tu per convidar-te a conèixer el projecte Paperblog, http://es.paperblog.com, Un nou servei de periodisme ciutadà. Paperblog és una plataforma digital que, a manera de revista de blocs, dóna a conèixer els millors articles dels blogs inscrits.
Si el concepte t'interessa només has de proposar un blog per a participar. Els articles estarien acompanyats del teu nom / pseudònim i fitxa de perfil, a més de diversos enllaços cap al bloc original, a el principi i a la fi de cada un. Els més interessants podran ser seleccionats per l'equip per aparèixer a Portada i tu pots ser seleccionat com a Autor del dia.
Espero que et motivi el projecte que vam iniciar amb tanta il·lusió al gener de 2010. Fes-li un ull i no dubtis a escribirme per conèixer més detalls.
Rep una cordial i afectuosa salutació,
Natalia