Kaip naudoti komandas, kurios vienu metu veikia tik su vienu failu, su visais pasirinktais failais

Daug kartų turime paleisti scenarijų, kad galėtume konvertuoti pdf į tekstą, konvertuoti .doc failus į HTML ir tt; esmė ta, kad šios komandos vienu metu priima tik vieną failą ir tai mums labai vargina, jei tą pačią užduotį reikia atlikti keliuose failuose, ypač kai darome scenarijų.

Aš siūlau šios problemos sprendimą naudojant ls, troškulys, grep, Oho y sh. Mes padarysime tai, kad kiekvienoje eilutėje sukursime teisingą komandinę eilutę ir vykdysime jas naudodami sh, o kadangi sh vykdys vieną eilutę vienu metu, RAM atminties sąnaudos nepadidės, o tai naudojant kitus metodus netgi gali užšaldyti nepakankamai veikiančias mašinas.

Pažiūrėkime, kaip atlikti šią komandų seką.

1- Pirmas dalykas, kurį turime padaryti, yra įvesti failus, kurie bus naudojami ls:

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

2- Tada mums reikės šių failų, kad perduotume kabutes «/ kelias / į grupę
failus«

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

3- Dabar Oho jis bus pasirengęs gauti duomenis.

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

nes Oho turi savo kalbą, mes turėsime atskirti kabutes, kurios norime pasirodyti, kad cituojame tekstą, tarp kitų funkcijų, kurias turėsime naudoti atgaliniu brūkšniu \ Pažiūrėkime, kaip atskirti kai kuriuos.
Atskirkite citatą

\”

Rodyti išvesties atgalinį brūkšnį (mums reikės įvesti tris juostas)

\\\

Kartais mums reikės atskyrimo skyriklio, išvestyje bus išvestas tik tekstas arba kabutės, pasirodžiusios dviem atgaliniais brūkšneliais:

'""'\"\'""'

4- Pažiūrėkime, kaip pervardyti visus failus, kurie išvardyti naudojant komandą mv tik norint įvesti galūnę. (Dabar, norėdami išvardyti failą, turėsime naudoti derinį „$ 0“, kai tik reikės)

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

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

Pabaiga pridedama, kaip parodyta ankstesnėje sekoje, derinys « | sh »Kuris nukreipia dujotiekį į šį komandų vertėją

Pažiūrėkime keletą pavyzdžių, paruoštų sukurti scenarijų.

Pavyzdžiai:

1- Konvertuokite visus išvardytus pdf failus į tekstinius failus.

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

Tokiu atveju nebūtina pasirinkti išvesties failo, nes „pdftotext“ automatiškai sukuria teksto failą su pagrindiniu pavadinimu ir .txt išimtimi tik tada, jei dirbate su vienu failu.

2- Tarkime, kad norime paveikslui pritaikyti efektą, tačiau nekeisdami originalo, pažiūrėkime pavyzdį su bangų efektu, gerai žinomu dėl „Windows XP“ logotipo, nes tai yra vėliavėlė su banguotais efektais (norint geriau įvertinti šį efektą, rekomenduojama naudoti kaip gautas vaizdas su plėtiniu .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

Pastaba: kelios eigos atliekamos tokia seka:

  • Vienas norint gauti aplanką, kuriame yra failas, su dirname
  • Kitas norint gauti bazinį pavadinimą, bet pašalinant minėto failo plėtinį
  • Kitas gauti minėtos bylos išimtį.

3- Pažiūrėkime, kaip pervadinti failų grupę, prieš pavadinimą įdėdami atitinkamą skaičių (skaitinė priesaga).

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

Norint įvesti skaičių, vidinė awk kalba buvo naudojama su parinktimi „FNR“, kurioje išvardytos kiekvienos išvesties eilutės, todėl numerį galima įdėti prieš tekstą arba po jo.

Pažiūrėkime, kaip įdėti skaitinį priešdėlį (įrašykite skaičių pabaigoje, bet prieš atleidimą) ši parinktis galioja tik tuo atveju, jei faile yra.

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- Pažiūrėkime pavyzdį, kur turėsime įvesti duomenis arba pasirinkti funkcijų grupę, imdami pavyzdį atvejį, kai pašaliname apsaugą slaptažodžiu iš kelių pdf failų, turinčių tą patį slaptažodį. (Šiuo atveju mes naudosime zenity kaip dialogo langą)

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

Priklausomai nuo senovės versijos, slaptažodžio parinktis gali būti tik –žodis.

Kaip matėte, tikslas yra sukurti failą, kuris bus sukurtas eilutės pradžioje tik vieną kartą, ir tada jis bus ištrintas, kai konversija bus baigta.

5- Kitas įrankis yra tas, kai turime išpakuoti kelis failus, sutankintus .zip formatu

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

Papildomos kabutės turi būti atskirtos tarpu, kuriame naudojama parinktis „$ 0“
pavyzdys
"unzip -x "$0" "

6- Pažiūrėkime pavyzdį, kaip apsaugoti pdf failą slaptažodžiu, leidžiantį skaityti, bet apsaugotą nuo kopijavimo ar kitų parinkčių spausdinimo (dialogo lange išvardytos parinktys bus tos, kurios bus leidžiamos pdf formatu, jei nenorite leisti nė vieno iš jų, nedarykite pasirinkti nieko).

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

Pateikiant šiuos pavyzdžius, yra gana pavyzdys, kaip naudoti šią parinktį norint konvertuoti, modifikuoti ar pervardyti kelis failus vienu scenarijumi ir nekonvertuojant jų rankomis po vieną. Atminties suvartojimas naudojant šią parinktį yra minimalus, atsižvelgiant į naudojamą komandą, nes ji nekonvertuoja jų tuo pačiu metu, bet viena po kitos.

Ši parinktis gali būti labai naudinga, jei norime konvertuoti visą vaizdo įrašų grupę naudodami „mencoder“, šiam neprisijungus prie vieno; galite parengti tam scenarijų, kurį jie tiesiog turės įdėti ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

FIN


Palikite komentarą

Jūsų elektroninio pašto adresas nebus skelbiamas. Privalomi laukai yra pažymėti *

*

*

  1. Atsakingas už duomenis: Miguel Ángel Gatón
  2. Duomenų paskirtis: kontroliuoti šlamštą, komentarų valdymą.
  3. Įteisinimas: jūsų sutikimas
  4. Duomenų perdavimas: Duomenys nebus perduoti trečiosioms šalims, išskyrus teisinius įsipareigojimus.
  5. Duomenų saugojimas: „Occentus Networks“ (ES) talpinama duomenų bazė
  6. Teisės: bet kuriuo metu galite apriboti, atkurti ir ištrinti savo informaciją.

  1.   Ramiro sakė

    Ar nebus daug, bet DAUG paprasčiau visa tai padaryti naudojant įprastus posakius ar pakaitalus? Aš nesuprantu, koks skirtumas tarp to ir jūsų gyvenimo tokio sudėtingumo.

  2.   kroto sakė

    Tiesą sakant, jūs puikiai išmanote „Linux“ komandas. Labai naudingas!

    1.    KZKG ^ Gaara sakė

      Taip, aš žinau, kad mes su juo daug ko sužinosime, hahaha.

  3.   Hexborg sakė

    Manau, kad tai yra daug lengviau:

    ls -d /path/to/folder/*.ext | skaitant failą; atlikite komandą „$ file“; padaryta

    Vietoj „COMMAND“ galite įdėti viską, ko norite, ir tai veikia, net jei failuose yra tuščių tarpų, jei tarp kabučių įdėsite failą „$“. Tam nereikia naudoti „sed“ arba generuoti komandų su „awk“. Taip pat paleidžiama mažiau procesų.

    1.    ankh sakė

      o:
      už i i $ (ls -d /path/to/folder/*.ext); atlikti komandą „$ i“; padaryta;

      1.    Hexborg sakė

        Tai atrodo gerai, bet jei failų pavadinimuose yra tuščių vietų, jis neveikia. 🙂

        1.    tahedas sakė

          Tiesą sakant, „hexborg“ yra tai, kodėl išvesties tekstas nurodomas kiekvienos eilutės pradžioje ir pabaigoje su šia parinktimi:
          ls –katalogas | sed 's / ^ / »/' | sed 's / $ / »/'

          Aš paaiškinu, kad radimą galima naudoti ieškant pakatalogiuose.

          1.    Hexborg sakė

            Bet su mano triuku jūs to neturite. ls paima visus failų pavadinimus po vieną kiekvienoje eilutėje ir perskaito skaito eilutes po eilutės ir palieka failo pavadinimą failo kintamajame, nesvarbu, ar jame tuščių tarpų. Jums tiesiog reikia įdėti kabutes aplink $ failą, kai naudojate jį komandoje.

          2.    Hugo sakė

            Sutinku, kad tai gali būti mažiau sudėtinga. Paimkime šį pavyzdį iš straipsnio:

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

            Tą patį būtų galima pasiekti tokiu būdu, ir jis greičiausiai veikia greičiau:

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

            Be to, straipsnis yra sveikintinas, visada gerai sužinoti apie alternatyvius būdus, kaip ką nors padaryti.

        2.    ankh sakė

          Jei pastebėsite, kad $ i yra kabutėse. Tai nereikalauja pabėgti iš baltosios erdvės.

          1.    Hexborg sakė

            Taip, bet operatorius $ () išplečia failų pavadinimus, niekur nedėdamas kabučių, todėl kintamasis i jau sugauna iškirptų failų pavadinimus. Išbandykite katalogo, kuriame yra failai su tarpais pavadinimuose, terminalą.

  4.   Liūtas sakė

    Labai gera, sudėtinga, bet labai įdomu.

  5.   helena_ryuu sakė

    tai nuostabu, puiku !!!!

  6.   MSX sakė

    Puiku, GNU / Linux plastiškumas neturi ribų.

  7.   Natalija sakė

    Gerbiamas tinklaraštininke,

    Esu Natalija, „Paperblog“ komunikacijos vadovė. Tai atradęs susisiekiu su jumis ir pakviečiu jus pažinti „Paperblog“ projektą, http://es.paperblog.com, nauja piliečių žurnalistikos tarnyba. „Paperblog“ yra skaitmeninė platforma, kuri kaip tinklaraščių žurnalas skelbia geriausius registruotų tinklaraščių straipsnius.

    Jei ši idėja jus domina, turite pasiūlyti dalyvauti tik savo tinklaraštyje. Prie kiekvieno straipsnio pradžioje ir pabaigoje prie straipsnių bus pridėtas jūsų vardas / pseudonimas ir profilio byla bei kelios nuorodos į originalų tinklaraštį. Komanda gali pasirinkti įdomiausius, kurie pasirodys pagrindiniame puslapyje, o jūs galite būti išrinktas dienos autoriumi.

    Tikiuosi, kad jus motyvuoja projektas, kurį su tokiu entuziazmu pradėjome 2010 m. Sausio mėnesį. Pažvelkite ir nedvejodami parašykite man daugiau informacijos.

    Gaukite nuoširdų ir meilų sveikinimą,
    Natalija