Kuinka käyttää komentoja, jotka toimivat vain yhden tiedoston kanssa kerrallaan kaikkien valitsemiesi tiedostojen kanssa

Monta kertaa meidän on suoritettava komentosarja muuntamaan pdf tekstiksi, muuntamaan .doc-tiedostot HTML: ksi jne.; Asia on, että nämä komennot hyväksyvät vain yhden tiedoston kerrallaan, ja se on meille erittäin tylsiä, jos joudumme suorittamaan saman tehtävän useille tiedostoille, varsinkin kun teemme komentosarjan.

Ehdotan ratkaisua tähän ongelmaan käyttämällä ls, jano, grep, awk y sh. Teemme luomalla oikean komentorivin jokaiselle riville ja suorittamalla ne sh: llä, ja koska sh suorittaa yhden rivin kerrallaan, RAM-muistin kulutus ei kasva, mikä muilla menetelmillä voi jopa jäädyttää alitehokkaat koneet.

Katsotaanpa, kuinka tämä komentosarja suoritetaan.

1- Ensimmäinen asia, joka meidän on tehtävä, on esitellä tiedostot, joita käytetään ls:

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

2- Sitten tarvitsemme näitä tiedostoja lainausten välittämiseen «/ polku / ryhmään
tiedostot«

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

3- Nyt awk se on valmis vastaanottamaan tiedot.

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

koska awk on oma kielensä, meidän on erotettava lainaukset, jotka haluamme ilmestyä lainaamaan tekstiä muiden toimintojen välillä, joita meidän on käytettävä kääntöviivaa \ Katsotaanpa, kuinka erottaa jotkut.
Erota tarjous

\”

Näytä taaksepäin vinoviiva (meidän on kirjoitettava kolme palkkia)

\\\

Joskus tarvitsemme eristävän erottimen, vain teksti tai lainausmerkit, jotka näkyvät kahden taaksepäin viivan sisällä:

'""'\"\'""'

4- Katsotaanpa, kuinka nimetä kaikki tiedostot, jotka on lueteltu komennolla mv vain syöttääksesi loppuliitteen. (Tiedoston luetteloimiseksi meidän on käytettävä yhdistelmää "$ 0" aina, kun meidän on käytettävä sitä)

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

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

Huomautus lisätään loppuun, kuten edellisessä järjestyksessä on esitetty, yhdistelmä « | sh »Joka ohjaa putkiston tähän komentotulkkiin

Katsotaanpa joitain esimerkkejä, jotka on valmistettu käsikirjoituksen luomiseen.

esimerkkejä:

1- Muunna kaikki luetellut pdf-tiedostot tekstitiedostoiksi.

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

Tässä tapauksessa ei ole välttämätöntä valita ulostulotiedostoa, koska pdftotext luo automaattisesti tekstitiedoston, jolla on perusnimi ja .txt-vapautus, vain ja vain, jos työskentelet yhden tiedoston kanssa.

2- Oletetaan, että haluamme soveltaa kuvaan tehosteita, mutta muuttamatta alkuperäistä, katsotaanpa esimerkki Windows XP -logosta tunnetusta aaltovaikutuksesta, koska se on lippu, jolla on aaltoilevia vaikutuksia (tämän vaikutuksen arvostamiseksi on suositeltavaa käyttää tuloksena olevan kuvan laajennuksella .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

Huomaa: Tässä sarjassa tehdään useita läpäisyjä:

  • Yksi hakemaan kansio, jossa tiedosto sijaitsee, ja dirname
  • Toinen saada perusnimi, mutta poistamalla mainitun tiedoston laajennus
  • Toinen saada vapautus mainitusta tiedostosta.

3- Katsotaan nyt, kuinka nimetä tiedostoryhmä uudelleen asettamalla vastaava numero nimen eteen (numeerinen jälkiliite).

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

Numeron syöttämiseen käytettiin sisäistä awk-kieltä vaihtoehdon "FNR" kanssa, joka listaa jokaisen tulosrivin, joten numero voidaan sijoittaa ennen tekstiä tai sen jälkeen.

Katsotaanpa, kuinka laitetaan numeerinen etuliite (laita numero loppuun, mutta ennen vapautusta) tämä vaihtoehto on voimassa vain, jos tiedostossa on

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- Katsotaanpa esimerkki, jossa meidän on syötettävä tietoja tai valittava toimintaryhmä, ottaen esimerkkinä tapaus, jossa poistamme salasanasuojauksen useista pdf-tiedostoista, joilla on sama salasana. (Tässä tapauksessa käytämme zenityä valintaikkunana)

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

Zenityn versiosta riippuen salasanan vaihtoehto voi olla vain –salasana.

Kuten näitte, tavoitteena on tehdä kissa tiedostosta, joka luodaan rivin alkuun vain kerran ja joka sitten poistetaan, kun muunnos on valmis.

5- Toinen apuohjelma on, kun meidän on purettava useita .zip-tiedostoon pakattuja tiedostoja

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

Ylimääräiset lainausmerkit on erotettava välilyönnillä, jossa käytetään vaihtoehtoa "0 dollaria".
esimerkki
"unzip -x "$0" "

6- Katsotaanpa esimerkki PDF-tiedoston suojaamisesta salasanalla, joka sallii lukemisen, mutta suojaa kopiointia tai muita vaihtoehtoja vastaan ​​(valintaikkunassa luetellut vaihtoehdot ovat ne, jotka sallitaan pdf-tiedostossa, jos et halua sallia mitään niistä, älä Älä valitse mitään).

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

Näillä esimerkeillä on varsin esimerkki siitä, kuinka tätä vaihtoehtoa käytetään useiden tiedostojen muuntamiseen, muokkaamiseen tai uudelleennimeämiseen yhdellä komentosarjalla ja muuntamatta niitä käsin yksi kerrallaan. Muistin kulutus tällä vaihtoehdolla on minimaalinen käytetystä komennosta riippuen, koska se ei muunna niitä samanaikaisesti vaan peräkkäin.

Tämä vaihtoehto voi olla erittäin hyödyllinen, jos haluamme muuntaa kokonaisen videoryhmän mencoderilla ilman, että tämä yhdistää niitä yhdeksi; voit valmistautua käsikirjoituksen tähän ja heidän tarvitsee vain laittaa ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

FIN


Jätä kommentti

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

*

*

  1. Vastuussa tiedoista: Miguel Ángel Gatón
  2. Tietojen tarkoitus: Roskapostin hallinta, kommenttien hallinta.
  3. Laillistaminen: Suostumuksesi
  4. Tietojen välittäminen: Tietoja ei luovuteta kolmansille osapuolille muutoin kuin lain nojalla.
  5. Tietojen varastointi: Occentus Networks (EU) isännöi tietokantaa
  6. Oikeudet: Voit milloin tahansa rajoittaa, palauttaa ja poistaa tietojasi.

  1.   Ramiro dijo

    Eikö se olisi paljon, mutta PALJON helpompaa tehdä tämä kaikki käyttämällä säännöllisiä lausekkeita tai jokerimerkkejä? En ymmärrä, mikä on ero sen välillä, että teet elämästäsi niin monimutkaista.

  2.   kroto dijo

    Totuus tahed, sinulla on paljon tietoa linux-komennoista. Todella hyödyllinen!

    1.    KZKG ^ Gaara dijo

      Kyllä, tiedän, että opimme paljon hänen kanssaan täältä hahaha.

  3.   hexborg dijo

    Mielestäni tämä on paljon helpompaa:

    ls -d /path/to/folder/*.ext | luettaessa tiedostoa; tee COMMAND "$ tiedosto"; tehty

    COMMAND-vaihtoehdon sijaan voit laittaa mitä haluat, ja se toimii, vaikka tiedostot sisältävät tyhjiä välilyöntejä, kunhan $-tiedosto laitetaan lainausmerkkien väliin. Sinun ei tarvitse käyttää sediä siihen tai luoda komentoja awk: llä. Myös tämä käynnistää vähemmän prosesseja.

    1.    ankh dijo

      o:
      i: lle luvussa $ (ls -d /path/a/folder/*.ext); tee komento “$ i”; tehty;

      1.    hexborg dijo

        Se näyttää hyvältä, mutta jos tiedostonimet sisältävät tyhjiä kohtia, se ei toimi. 🙂

        1.    tahed dijo

          Itse asiassa hexborg on, miksi lähtöteksti lainataan alussa ja lopussa jokaiselle riville tällä vaihtoehdolla:
          ls -hakemisto | sed 's / ^ / »/' | sed 's / $ / »/'

          Selvennän, että hakua voidaan käyttää hakemiseen alihakemistoista.

          1.    hexborg dijo

            Mutta minun temppuni kanssa sinun ei tarvitse. Ls ottaa tiedostojen täydelliset nimet yksi kullekin riville ja lukee lukee rivi riviltä ja jättää tiedostonimen tiedostomuuttujaan riippumatta siitä, onko siinä tyhjiä välilyöntejä. Sinun tarvitsee vain laittaa lainausmerkit $ -tiedoston ympärille, kun käytät sitä komennossa.

          2.    Hugo dijo

            Olen samaa mieltä siitä, että se voi olla vähemmän hankala. Otetaan tämä esimerkki artikkelista:

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

            Sama voidaan saavuttaa näin, ja se todennäköisesti toimii nopeammin:

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

            Artikkeli on kuitenkin tervetullut, on aina hyvä oppia vaihtoehtoisista tavoista tehdä jotain.

        2.    ankh dijo

          Jos huomaat, että $ i on lainausmerkeissä. Tämä tekee tyhjätilan tyhjentämisestä tarpeetonta.

          1.    hexborg dijo

            Kyllä, mutta $ () -operaattori laajentaa tiedostojen nimiä laittamatta lainausmerkkejä mihin tahansa, joten muuttuja i saa kiinni leikattujen tiedostojen nimet. Kokeile sitä hakemiston päätelaitteessa, jonka nimissä on tiedostoja, joissa on välilyöntejä.

  4.   Leijona dijo

    Erittäin hyvä, monimutkainen, mutta erittäin mielenkiintoinen.

  5.   helena_ryuu dijo

    tämä on hämmästyttävää, hieno !!!!

  6.   MSX dijo

    Erinomainen, GNU / Linuxin plastisuudella ei ole rajoja.

  7.   Natalia dijo

    Hyvä bloggaaja,

    Olen Natalia, Paperblogin viestintäpäällikkö. Kun olen löytänyt sen, otan sinuun yhteyttä kutsua sinut tuntemaan Paperblog-projektin, http://es.paperblog.com, uusi kansalaisten journalismin palvelu. Paperblog on digitaalinen foorumi, joka julkaisee, kuten blogilehti, rekisteröityjen blogien parhaat artikkelit.

    Jos konsepti kiinnostaa sinua, sinun tarvitsee vain ehdottaa blogiisi osallistumista. Artikkelien mukana olisi nimesi / salanimesi ja profiilitiedostosi sekä useita linkkejä alkuperäiseen blogiin jokaisen alussa ja lopussa. Tiimi voi valita mielenkiintoisimmat näkymään kansilehdellä ja sinut voidaan valita päivän kirjoittajaksi.

    Toivon, että sinut motivoi projekti, jonka aloitimme niin innostuneesti tammikuussa 2010. Katso ja älä epäröi kirjoittaa minulle lisätietoja.

    Vastaanota sydämellinen ja hellä tervehdys
    Natalia