Utilització de comandaments que només treballen amb un arxiu alhora amb tots els fitxers que seleccions

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

En aquest cas no cal seleccionar un fitxer de sortida ja que pdftotext genera automàticament un fitxer de text amb el nom base i l'exempció .txt si i només si es treballa amb un sol arxiu.

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

Per ingressar-lo nombre es ús el llenguatge intern de awk amb l'opció "FNR" que enumera cada línia de sortida, de manera que el nombre es pot posar endavant o darrere de el text.

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

En dependència de la versió de zenity l'opció per al password pot ser només -pasword.

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

Les cometes extres hauran de separar-se amb un espai on es faci servir l'opció «$ 0»
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.

Aquesta opció ens pot resultar molt útil si volem convertir tot un grup de vídeos amb mencoder sense que aquest els uneixi en un de sol; es pot preparar un script per això i només haurien de posar ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

FI


15 comentaris, deixa el teu

Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.

  1.   Ramiro va dir

    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ò.

  2.   croto va dir

    La veritat tahed, tenes gran coneixement de les ordres de linux. Molt útil!

    1.    KZKG ^ Gaara va dir

      Sí, sé que aprendrem molt amb ell per aquí hahaha.

  3.   hexborg va dir

    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.

    1.    Ankh va dir

      o:
      for i in $ (ls -d /camino/a/carpeta/*.ext); do COMANDO "$ i"; done;

      1.    hexborg va dir

        Això té bona pinta, però si els noms dels fitxers contenen espais en blanc no funciona. 🙂

        1.    tahed va dir

          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.

          1.    hexborg va dir

            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.

          2.    Hugo va dir

            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.

        2.    Ankh va dir

          Si et fixes les $ i està entre cometes. Això fa innecessari escapar els espais en blanc.

          1.    hexborg va dir

            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.

  4.   Lleó va dir

    Molt bo, complex, però molt interessant.

  5.   helena_ryuu va dir

    això és al·lucinant, bonissim !!!!

  6.   MSX va dir

    Excel·lent, la plasticitat de GNU / Linux no té límits.

  7.   Natalia va dir

    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