Kako koristiti naredbe koje istovremeno rade samo s jednom datotekom sa svim datotekama koje odaberete

Mnogo puta moramo pokrenuti skriptu za pretvaranje pdf-a u tekst, pretvaranje .doc datoteka u html itd .; poanta je u tome da ove naredbe istodobno prihvaćaju samo jednu datoteku i to je za nas vrlo zamorno ako trebamo izvršiti isti zadatak na nekoliko datoteka, posebno kada radimo skriptu.

Predlažem rješenje za ovaj problem pomoću ls, žeđ, grep, awk y sh. Ono što ćemo učiniti je stvoriti ispravnu naredbenu liniju u svakom retku i izvršavati ih sa sh, a budući da će sh izvršavati jednu po jednu liniju, potrošnja ram memorije se neće povećavati, što drugim metodama može čak zamrznuti i slabije pogonske strojeve.

Pogledajmo kako izvršiti ovaj redoslijed naredbi.

1- Prvo što moramo učiniti je predstaviti datoteke koje će se koristiti ls:

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

2- Tada će nam trebati ove datoteke za prosljeđivanje citata «/ put / do grupe od
datoteke«

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

3- Sada awk bit će spreman za primanje podataka.

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

jer awk ima svoj jezik trebat ćemo odvojiti navodnike za koje želimo da citiraju tekst među ostalim funkcijama trebat ćemo za uporabu kose crte \ Pogledajmo kako razdvojiti neke.
Odvojite citat

\”

Prikažite kosu crtu u izlazu (trebat ćemo upisati tri trake)

\\\

Ponekad će nam trebati izolirajući separator, u izlazu će se pojaviti samo tekst ili citati koji se pojavljuju unutar dviju kosih crta:

'""'\"\'""'

4- Pogledajmo kako preimenovati sve datoteke koje su navedene pomoću naredbe mv samo za unos sufiksa. (Sada da bismo popisali datoteku trebat ćemo upotrijebiti kombinaciju "$ 0" kad god je trebamo koristiti)

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

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

Na kraju se dodaje napomena kao što je prikazano u prethodnom slijedu kombinacija « | š »Koji preusmjerava cjevovod na ovaj tumač naredbi

Pogledajmo nekoliko primjera pripremljenih za stvaranje skripte.

Primjeri:

1- Pretvorite sve PDF datoteke koje su navedene u tekstualne datoteke.

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

U ovom slučaju nije potrebno odabrati izlaznu datoteku jer pdftotext automatski generira tekstualnu datoteku s osnovnim imenom i izuzećem .txt ako i samo ako radite s jednom datotekom.

2- Recimo da želimo primijeniti efekt na sliku, ali bez izmjene originala, pogledajmo primjer s valnim efektom dobro poznatim po logotipu Windows XP, budući da je to zastava s valovitim efektima (da bismo bolje procijenili taj efekt preporučuje se koristiti kao rezultirajuća slika s nastavkom .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

Napomena: nekoliko prolaza je napravljeno u ovom slijedu:

  • Jedan za dobivanje mape u kojoj se datoteka nalazi s dirnameom
  • Još jedan za dobivanje osnovnog imena, ali uklanjanje nastavka spomenute datoteke
  • Još jedan za dobivanje izuzeća od spomenute datoteke.

3- Pogledajmo sada kako preimenovati skupinu datoteka stavljanjem odgovarajućeg broja ispred imena (numerički sufiks).

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

Za unos broja korišten je interni awk jezik s opcijom "FNR" koja navodi svaki redak izlaza, tako da se broj može staviti prije ili poslije teksta.

Pogledajmo kako staviti numerički prefiks (staviti broj na kraj, ali prije izuzeća) ova opcija vrijedi samo ako datoteka ima.

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- Pogledajmo primjer gdje ćemo morati unijeti podatke ili odabrati skupinu funkcija, uzimajući za primjer slučaj kada uklanjamo zaštitu lozinkom s nekoliko pdf datoteka koje imaju istu lozinku. (U ovom ćemo slučaju zenity koristiti kao dijaloški okvir)

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

Ovisno o verziji zenity, opcija za lozinku može biti samo –pasword.

Kao što ste vidjeli, cilj je napraviti mačku od datoteke koja će biti stvorena na početku retka samo jednom, a zatim će biti eliminirana nakon dovršetka pretvorbe.

5- Drugi je uslužni program kada moramo raspakirati nekoliko datoteka zbijenih u .zip

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

Dodatni citati moraju biti odvojeni razmakom u kojem se koristi opcija "$ 0".
primjer
"unzip -x "$0" "

6- Pogledajmo primjer zaštite pdf lozinkom, omogućavajući čitanje, ali zaštićen od ispisa kopije ili drugih opcija, (opcije navedene u dijaloškom okviru bit će one koje će biti dopuštene u pdf-u, ako ne želite dopustiti nijednu od njih, nemojte ne odabrati nijedan).

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

S ovim primjerima sasvim je jasno kako koristiti ovu opciju za pretvorbu, izmjenu ili preimenovanje nekoliko datoteka jednom skriptom, a ne za ručno pretvaranje jedne po jedne. Potrošnja memorije s ovom opcijom minimalna je, ovisno o naredbi koja se koristi, jer ih ne pretvara istovremeno, već jednu za drugom.

Ova opcija može biti vrlo korisna ako želimo pretvoriti cijelu skupinu videozapisa pomoću mencodera, a da ih ovaj ne spaja u jedan; možete pripremiti skriptu za ovo, a oni bi to jednostavno trebali staviti ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

FIN


Ostavite svoj komentar

Vaša email adresa neće biti objavljen. Obavezna polja su označena s *

*

*

  1. Za podatke odgovoran: Miguel Ángel Gatón
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obvezi.
  5. Pohrana podataka: Baza podataka koju hostira Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   Ramiro dijo

    Ne bi li bilo puno, ali MNOGO lakše sve to učiniti pomoću regularnih izraza ili zamjenskih znakova? Ne razumijem u čemu je razlika između toga i toga što si tako zakomplicirao život.

  2.   kroto dijo

    Istina tahed, imate izvrsno znanje o linux naredbama. Jako korisno!

    1.    KZKG ^ Gaara dijo

      Da, znam da ćemo s njim ovdje naučiti puno toga hahaha.

  3.   hexborg dijo

    Mislim da je ovo puno lakše:

    ls -d /path/to/folder/*.ext | dok čita datoteku; učiniti ZAPOVIJED "$ datoteka"; gotovo

    Umjesto ZAPOVIJED možete staviti sve što želite i to radi čak i ako datoteke sadrže prazne prostore sve dok stavite $ datoteku između navodnika. Za to ne trebate koristiti sed ili generirati naredbe s awk. Također ovo pokreće manje procesa.

    1.    Ankh dijo

      o:
      za i u $ (ls -d /path/a/folder/*.ext); izvršiti ZAPOVIJED “$ i”; gotovo;

      1.    hexborg dijo

        To izgleda dobro, ali ako nazivi datoteka sadrže praznine, to ne radi. 🙂

        1.    tahed dijo

          Zapravo je hexborg razlog zašto se izlazni tekst citira na početku i na kraju za svaki redak s ovom opcijom:
          ls –direktorij | sed 's / ^ / »/' | sed 's / $ / »/'

          Pojašnjavam da se find može koristiti za pretraživanje poddirektorijuma.

          1.    hexborg dijo

            Ali s mojim trikom ne moraš. ls uzima puna imena datoteka po jedno na svakom retku i čita čitav red po redak te ostavlja naziv datoteke u varijabli datoteke bez obzira na to ima li praznih prostora ili ne. Samo trebate staviti navodnike oko $ datoteke kada je koristite u naredbi.

          2.    Hugo dijo

            Slažem se da u pronalasku može biti manje glomazan. Uzmimo ovaj primjer iz članka:

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

            Isto bi se moglo postići ovako, a vjerojatno radi brže:

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

            Ipak, članak je dobrodošao, uvijek je dobro naučiti o alternativnim načinima nečega.

        2.    Ankh dijo

          Ako primijetite da je $ i u navodnicima. To bijeg iz praznog prostora čini nepotrebnim.

          1.    hexborg dijo

            Da, ali operater $ () proširuje nazive datoteka bez stavljanja citata bilo gdje, tako da varijabla i već hvata imena izrezanih datoteka. Pokušajte u terminalu u direktoriju koji sadrži datoteke s razmacima u imenima.

  4.   Lav dijo

    Vrlo dobro, složeno, ali vrlo zanimljivo.

  5.   helena_ryuu dijo

    ovo je nevjerojatno, super !!!!

  6.   MSX dijo

    Izvrsno, plastičnost GNU / Linuxa nema ograničenja.

  7.   Natalia dijo

    Dragi bloger,

    Ja sam Natalia, voditeljica komunikacija u Paperblogu. Nakon što sam ga otkrio, stupam u kontakt s vama kako bih vas pozvao da upoznate projekt Paperblog, http://es.paperblog.com, nova služba za građansko novinarstvo. Paperblog je digitalna platforma koja poput blog časopisa objavljuje najbolje članke registriranih blogova.

    Ako vas koncept zanima, samo morate predložiti svoj blog za sudjelovanje. Članci će biti popraćeni vašim imenom / pseudonimom i datotekom profila, kao i nekoliko veza do izvornog bloga, na početku i na kraju svakog od njih. Tim može odabrati one najzanimljivije da se pojave na naslovnoj stranici, a vi možete biti izabrani za autora dana.

    Nadam se da vas motivira projekt koji smo s takvim entuzijazmom započeli u siječnju 2010. Pogledajte i ne ustručavajte se pisati mi za više detalja.

    Primite srdačan i privržen pozdrav,
    Natalia