Jak používat příkazy, které fungují pouze s jedním souborem najednou, se všemi soubory, které vyberete

Mnohokrát musíme spustit skript, který převede soubor PDF na text, převede soubory .doc na html atd .; jde o to, že tyto příkazy přijímají pouze jeden soubor najednou, a to je velmi zdlouhavé, pokud potřebujeme provést stejný úkol na několika souborech, zvláště když děláme skript.

Navrhuji řešení tohoto problému pomocí ls, žízeň, grep, Awk y sh. Co uděláme, je vytvořit správný příkazový řádek v každém řádku a spustit jej pomocí sh, a protože sh bude spouštět jeden řádek najednou, spotřeba paměti RAM se nezvýší, což u jiných metod může dokonce zmrazit stroje bez výkonu.

Podívejme se, jak provést tuto sekvenci příkazů.

1- První věcí, kterou musíme udělat, je představit soubory, které budou použity ls:

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

2- Pak tyto soubory budeme potřebovat k předávání nabídek «/ cesta / do skupiny
soubory«

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

3- Nyní Awk bude připraven přijímat data.

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

Protože Awk má svůj vlastní jazyk, budeme muset oddělit uvozovky, které chceme zobrazit, abychom citovali text mezi další funkce, které budeme muset použít zpětné lomítko \ Podívejme se, jak některé oddělit.
Oddělte nabídku

\”

Zobrazit zpětné lomítko na výstupu (budeme muset zadat tři pruhy)

\\\

Někdy budeme potřebovat oddělovací oddělovač, na výstupu bude pouze text nebo uvozovky, které se objeví ve dvou zpětných lomítkách:

'""'\"\'""'

4- Podívejme se, jak pomocí příkazu přejmenovat všechny soubory, které jsou uvedeny mv stačí zadat příponu. (Nyní pro vypsání souboru budeme muset použít kombinaci „$ 0“, kdykoli ji budeme potřebovat)

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

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

Poznámka je přidána na konec, jak je znázorněno v předchozí sekvenci kombinace « | sh »Který přesměruje kanál na tohoto interpreta příkazů

Podívejme se na několik příkladů připravených k vytvoření skriptu.

Příklady:

1- Převeďte všechny soubory PDF, které jsou uvedeny na textové soubory.

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

V tomto případě není nutné vybrat výstupní soubor, protože pdftotext automaticky generuje textový soubor se základním názvem a výjimkou .txt, právě když pracujete s jedním souborem.

2- Řekněme, že chceme použít efekt na obrázek, ale bez úpravy originálu se podívejme na příklad s vlnovým efektem dobře známým pro logo Windows XP, protože se jedná o příznak s vlnitými efekty (pro lepší zhodnocení tohoto doporučeno použít jako výsledný obrázek s příponou .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

Poznámka: V tomto pořadí je provedeno několik průchodů:

  • Jeden pro získání složky, kde je soubor umístěn, s adresářem
  • Další k získání základního názvu, ale odstranění přípony uvedeného souboru
  • Další k získání výjimky z uvedeného spisu.

3- Podívejme se nyní, jak přejmenovat skupinu souborů vložením odpovídajícího čísla před jméno (číselná přípona).

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

K zadání čísla byl použit interní jazyk awk s možností „FNR“, která uvádí každý řádek výstupu, takže číslo lze umístit před nebo za text.

Podívejme se, jak vložit číselnou předponu (na konec vložte číslo, ale před výjimku), tato možnost je platná, pouze pokud má soubor a.

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- Podívejme se na příklad, kde budeme muset zadat data nebo vybrat skupinu funkcí, přičemž jako příklad použijeme případ, kdy odstraníme ochranu heslem z několika souborů PDF, které mají stejné heslo. (V tomto případě použijeme zenity jako dialogové okno)

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

V závislosti na verzi zenity může být volba hesla pouze –pasword.

Jak jste viděli, cílem je vytvořit kočku ze souboru, který bude vytvořen na začátku řádku pouze jednou a poté bude odstraněn, jakmile bude převod dokončen.

5- Dalším nástrojem je, když potřebujeme rozbalit několik souborů zkomprimovaných v .zip

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

Zvláštní uvozovky musí být odděleny mezerou, kde je použita možnost „$ 0“.
příklad
"unzip -x "$0" "

6- Podívejme se na příklad ochrany souboru PDF heslem, který umožňuje čtení, ale je chráněn proti tisku kopie nebo jiných možností (možnosti uvedené v dialogovém okně budou ty, které budou povoleny v souboru PDF, pokud nechcete povolit žádné z nich, nevyberete žádné).

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

U těchto příkladů je docela názorné, jak použít tuto možnost k převodu, úpravě nebo přejmenování několika souborů pomocí jediného skriptu a nikoli k jejich ručnímu převodu jeden po druhém. Spotřeba paměti u této možnosti je minimální, v závislosti na použitém příkazu, protože je nepřevádí současně, ale jeden po druhém.

Tato možnost může být velmi užitečná, pokud chceme převést celou skupinu videí pomocí mencoderu, aniž bychom je spojili do jednoho; můžete si na to připravit scénář a oni by to prostě museli dát ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

PLOUTEV


Zanechte svůj komentář

Vaše e-mailová adresa nebude zveřejněna. Povinné položky jsou označeny *

*

*

  1. Odpovědný za údaje: Miguel Ángel Gatón
  2. Účel údajů: Ovládací SPAM, správa komentářů.
  3. Legitimace: Váš souhlas
  4. Sdělování údajů: Údaje nebudou sděleny třetím osobám, s výjimkou zákonných povinností.
  5. Úložiště dat: Databáze hostovaná společností Occentus Networks (EU)
  6. Práva: Vaše údaje můžete kdykoli omezit, obnovit a odstranit.

  1.   Ramiro řekl

    Nebylo by to hodně, ale mnohem jednodušší to všechno pomocí regulárních výrazů nebo zástupných znaků? Nechápu, jaký je rozdíl mezi tím a tím, jak si s tím komplikuješ život.

  2.   Croto řekl

    Pravda je, že máte skvělé znalosti linuxových příkazů. Velmi užitečné!

    1.    KZKG ^ Gaara řekl

      Ano, vím, že se s ním tady hodně naučíme, hahaha.

  3.   hexborg řekl

    Myslím, že je to mnohem jednodušší:

    ls -d /path/to/folder/*.ext | při čtení souboru; dělat PŘÍKAZ "$ soubor"; Hotovo

    Místo PŘÍKAZU můžete dát cokoli chcete a funguje to, i když soubory obsahují mezery, pokud vložíte $ soubor mezi uvozovky. K tomu nemusíte používat sed ani generovat příkazy pomocí awk. Také to spouští méně procesů.

    1.    Ankh řekl

      o:
      pro i v $ (ls -d /path/a/folder/*.ext); dělat PŘÍKAZ „$ i“; Hotovo;

      1.    hexborg řekl

        To vypadá dobře, ale pokud názvy souborů obsahují mezery, nefunguje to. 🙂

        1.    tahal řekl

          Ve skutečnosti je hexborg důvodem, proč je výstupní text citován na začátku a na konci pro každý řádek s touto možností:
          ls - adresář | sed 's / ^ / »/' | sed 's / $ / »/'

          Upřesňuji, že find lze použít k prohledání podadresářů.

          1.    hexborg řekl

            Ale s mým trikem nemusíte. ls vezme celé názvy souborů po jednom na každém řádku a přečte řádek po řádku a ponechá název souboru v proměnné souboru bez ohledu na to, zda má prázdné mezery nebo ne. Při použití v příkazu stačí uvést uvozovky kolem $ file.

          2.    Hugo řekl

            Souhlasím, že při hledání to může být méně těžkopádné. Vezměme si tento příklad z článku:

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

            Totéž lze dobře dosáhnout takto a pravděpodobně běží rychleji:

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

            Článek je tedy vítán, vždy je dobré se dozvědět o alternativních způsobech, jak něco udělat.

        2.    Ankh řekl

          Pokud si všimnete, že $ i je v uvozovkách. Díky tomu je únik mezer zbytečný.

          1.    hexborg řekl

            Ano, ale operátor $ () rozšiřuje názvy souborů, aniž by kamkoli uváděl uvozovky, takže proměnná i již zachycuje názvy vyjmutých souborů. Zkuste to v terminálu v adresáři, který má soubory s mezerami v názvech.

  4.   Lev řekl

    Velmi dobrý, složitý, ale velmi zajímavý.

  5.   helena_ryuu řekl

    to je úžasné, skvělé !!!!

  6.   MSX řekl

    Výborně, plasticita GNU / Linuxu nemá žádná omezení.

  7.   Natalia řekl

    Vážený blogere,

    Jsem Natalia, manažerka komunikace ve společnosti Paperblog. Poté, co jsem to objevil, se s vámi spojím, abych vás pozval, abyste poznali projekt Paperblog, http://es.paperblog.com, nová občanská žurnalistická služba. Paperblog je digitální platforma, která stejně jako blogový časopis vydává nejlepší články registrovaných blogů.

    Pokud vás tento koncept zajímá, musíte pouze navrhnout, aby se váš blog účastnil. K článkům bude na začátku a na konci každého z nich přiloženo vaše jméno / pseudonym a soubor profilu a také několik odkazů na původní blog. Tým nejzajímavějších může vybrat tým, který se zobrazí na titulní stránce, a můžete si vybrat jako Autora dne.

    Doufám, že vás motivuje projekt, který jsme s takovým nadšením zahájili v lednu 2010. Podívejte se a pro bližší informace mi neváhejte napsat.

    Přijměte srdečný a láskyplný pozdrav,
    Natalia