Hogyan használhatunk olyan parancsokat, amelyek egyszerre csak egy fájllal működnek az összes kiválasztott fájllal

Sokszor le kell futtatnunk egy szkriptet, hogy egy pdf-t szöveggé alakítsunk, a .doc fájlokat html-be konvertáljunk stb. a lényeg az, hogy ezek a parancsok egyszerre csak egy fájlt fogadnak el, és ez nagyon unalmas számunkra, ha ugyanazt a feladatot több fájlnál kell végrehajtanunk, különösen akkor, ha szkriptet készítünk.

Javaslatot teszek erre a problémára ls, szomjúság, grep, awk y sh. Azt fogjuk tenni, hogy minden sorban létrehozzuk a helyes parancssort, és végrehajtjuk őket sh-vel, és mivel sh egyszerre egy sort hajt végre, a ram memória fogyasztása nem fog növekedni, ami más módszerekkel akár az alulteljesített gépeket is megfagyhatja.

Lássuk, hogyan kell végrehajtani ezt a parancssort.

1- Az első dolog, amit meg kell tennünk, be kell mutatnunk azokat a fájlokat, amelyeket át fogunk használni ls:

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

2- Akkor szükségünk lesz ezekre a fájlokra az árajánlatok átadásához «/ útvonal / a csoportba
fájlokat«

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

3- Most awk készen áll az adatok fogadására.

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

mert awk megvan a saját nyelve, el kell választanunk azokat az idézőjeleket, amelyek megjelenni szeretnének egy szöveg idézésében, a többi funkció között. \ Lássuk, hogyan lehet elválasztani néhányat.
Válasszon külön ajánlatot

\”

Visszajelet mutat a kimenetben (három sávot kell beírnunk)

\\\

Időnként szükségünk lesz egy elválasztó elválasztóra, csak a két visszavágáson belül megjelenő szöveg vagy idézőjel jelenik meg a kimenetben:

'""'\"\'""'

4- Lássuk, hogyan nevezhetjük át az összes felsorolt ​​fájlt a paranccsal mv csak egy utótag beírásához. (Most a fájl felsorolásához a "$ 0" kombinációt kell használnunk, amikor csak használnunk kell)

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

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

Megjegyzés hozzáadódik a végéhez, az előző sorrendben látható módon a « | SH »Ami átirányítja a folyamatot erre a parancsértelmezőre

Nézzünk meg néhány példát, amelyek előkészültek egy szkript létrehozására.

Példák:

1- Konvertálja a szöveges fájlokban felsorolt ​​összes pdf-t.

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

Ebben az esetben nem szükséges kimeneti fájlt kiválasztani, mivel a pdftotext csak akkor generál szöveges fájlt az alapnévvel és a .txt mentességgel, ha egyetlen fájllal dolgozik.

2- Tegyük fel, hogy egy képre szeretnénk effektust alkalmazni, de az eredeti módosítása nélkül lássunk egy példát a Windows XP logóhoz jól ismert hullámhatással, mivel hullámos effektusokkal rendelkező zászlóról van szó (ennek a hatásnak a jobb értékelése érdekében javasolt képként használni .png kiterjesztéssel).

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

Megjegyzés: ebben a sorrendben több átadás történik:

  • Az egyik a dirname nevű mappához, ahol a fájl található
  • Egy másik az alapnév megszerzéséhez, de az említett fájl kiterjesztésének eltávolítása
  • Egy másik a fájl mentességének megszerzéséhez.

3- Most nézzük meg, hogyan lehet átnevezni egy fájlcsoportot úgy, hogy a megfelelő számot a név elé helyezzük (numerikus utótag).

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

A szám megadásához a belső awk nyelvet használták az "FNR" opcióval, amely felsorolja az egyes kimeneti sorokat, így a szám elhelyezhető a szöveg előtt vagy után.

Lássuk, hogyan lehet egy numerikus előtagot elhelyezni (tegyen egy számot a végére, de a mentesség elé) ez az opció csak akkor érvényes, ha a fájlnak van egy.

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- Lássunk egy példát, ahol adatokat kell megadnunk, vagy ki kell választanunk egy funkciócsoportot, példaként véve azt az esetet, amikor eltávolítjuk a jelszóvédelmet több, azonos jelszóval rendelkező pdf fájlból. (Ebben az esetben a zenity-t fogjuk használni párbeszédpanelként)

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

A zenity verziójától függően a jelszó opciója csak –jelszó lehet.

Amint látta, a cél egy macska készítése egy fájlból, amely csak egyszer jön létre a sor elején, majd az átalakítás befejeztével megszűnik.

5- Egy másik segédprogram, amikor több, .zip formátumban tömörített fájlt kell kicsomagolnunk

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

Az extra idézőjeleket egy szóközzel kell elválasztani, ahol a "$ 0" opciót használják.
példa
"unzip -x "$0" "

6- Lássunk egy példát a pdf-nek az olvasást lehetővé tevő, de a másolás vagy más opciók nyomtatásával védett jelszavával történő védelmére (a párbeszédpanelen felsorolt ​​opciók azok lesznek, amelyeket a pdf engedélyez, ha nem szeretne közülük ne válasszon egyet).

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

Ezekkel a példákkal jól példázza, hogyan lehet ezt az opciót felhasználni több fájl konvertálásához, módosításához vagy átnevezéséhez egyetlen szkript segítségével, és nem kézzel konvertálni őket egyesével. A memóriafogyasztás ezzel az opcióval minimális, a használt parancstól függően, mivel nem egyszerre, hanem egymás után konvertálja őket.

Ez az opció nagyon hasznos lehet, ha a videók teljes csoportját konvertálni akarjuk a mencoderrel anélkül, hogy ez összekapcsolná őket; készíthet ehhez egy szkriptet, és nekik csak fel kellene tenniük ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

FIN


15 hozzászólás, hagyd a tiedet

Hagyja megjegyzését

E-mail címed nem kerül nyilvánosságra. Kötelező mezők vannak jelölve *

*

*

  1. Az adatokért felelős: Miguel Ángel Gatón
  2. Az adatok célja: A SPAM ellenőrzése, a megjegyzések kezelése.
  3. Legitimáció: Az Ön beleegyezése
  4. Az adatok közlése: Az adatokat csak jogi kötelezettség alapján továbbítjuk harmadik felekkel.
  5. Adattárolás: Az Occentus Networks (EU) által üzemeltetett adatbázis
  6. Jogok: Bármikor korlátozhatja, helyreállíthatja és törölheti adatait.

  1.   Ramiro dijo

    Nem lenne sok, de SOKKAL könnyebb mindezt elvégezni a reguláris kifejezések vagy a helyettesítő karakterek használatával? Nem értem, mi a különbség ennek és az életed ilyen bonyolulttá tétele között.

  2.   kroto dijo

    Az igazság meglepődött, nagy ismerete van a linux parancsokról. Nagyon hasznos!

    1.    KZKG ^ Gaara dijo

      Igen, tudom, hogy sokat fogunk tanulni vele itt hahaha.

  3.   hexborg dijo

    Szerintem ez sokkal könnyebb:

    ls -d /path/to/folder/*.ext | fájl olvasása közben; do COMMAND "$ file"; Kész

    A COMMAND helyett bármit beírhat, amit csak akar, és akkor is működik, ha a fájlok üres tereket tartalmaznak, amíg a $ fájlt idézőjelek közé teszi. Ehhez nem kell sed használni, vagy az awk paranccsal generálni a parancsokat. Ez is kevesebb folyamatot indít el.

    1.    Ankh dijo

      o:
      i-re $ -ban (ls -d /path/a/folder/*.ext); tegye a „$ i” parancsot; Kész;

      1.    hexborg dijo

        Ez jól néz ki, de ha a fájlnevek üreseket tartalmaznak, akkor nem működik. 🙂

        1.    tahed dijo

          Valójában a hexborg ezért idézi a kimeneti szöveget az egyes sorok elején és végén ezzel az opcióval:
          ls –könyvtár | sed 's / ^ / »/' | sed 's / $ / »/'

          Tisztázom, hogy a find felhasználható az alkönyvtárakban történő keresésre.

          1.    hexborg dijo

            De az én trükkemmel nem kell. Az ls minden sorban egyenként felveszi a fájlok teljes nevét, és soronként olvassa a fájlokat, és a fájlnevet a fájlváltozóban hagyja, függetlenül attól, hogy van-e üres szóköz. Csak parancsokat használva idézőjeleket kell tennie a $ fájl köré.

          2.    Hugo dijo

            Egyetértek azzal, hogy a megállapításban ez kevésbé nehézkes lehet. Vegyük ezt a példát a cikkből:

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

            Ugyanezt el lehetne érni így, és valószínűleg gyorsabban fut:

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

            Ennek ellenére a cikket örömmel fogadjuk, mindig jó megismerni a cselekvés alternatív módjait.

        2.    Ankh dijo

          Ha észreveszi, hogy a $ i idézőjelben szerepel. Ez szükségtelenné teszi a szóköz elhagyását.

          1.    hexborg dijo

            Igen, de a $ () operátor kibővíti a fájlneveket úgy, hogy idézőjeleket sehova nem tesz, így az i változó már elkapja a kivágott fájlok nevét. Próbálja ki egy könyvtár termináljában, amelynek fájljai szóközökkel rendelkeznek a nevekben.

  4.   oroszlán dijo

    Nagyon jó, összetett, de nagyon érdekes.

  5.   helena_ryuu dijo

    ez csodálatos, nagyszerű !!!!

  6.   MSX dijo

    Kiváló, a GNU / Linux plaszticitásának nincsenek korlátai.

  7.   Natalia dijo

    Kedves blogger!

    Natalia vagyok, a Paperblog kommunikációs menedzsere. Miután felfedeztem, kapcsolatba lépek Önnel, hogy meghívjam Önt a Paperblog projekt megismerésére, http://es.paperblog.com, egy új állampolgári újságírói szolgálat. A Paperblog egy olyan digitális platform, amely blogmagazinként a regisztrált blogok legjobb cikkeit teszi közzé.

    Ha a koncepció érdekel, akkor csak a blogodra kell javaslatot tenni a részvételhez. A cikkeket az Ön neve / álneve és profilfájlja, valamint az eredeti blogra mutató számos link tartalmazza, mindegyik elején és végén. A legérdekesebbeket a csapat választhatja ki, hogy megjelennek a címlapon, és kiválaszthatja a nap szerzőjének.

    Remélem, hogy motiválja Önt a projekt, amelyet 2010 januárjában olyan lelkesen kezdtünk. Vessen egy pillantást, és ne habozzon, írjon nekem további részletekért.

    Fogadjon szívélyes és szeretetteljes üdvözletet,
    Natalia