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
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
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
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
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.
ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"
PLOUTEV
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.
Pravda je, že máte skvělé znalosti linuxových příkazů. Velmi užitečné!
Ano, vím, že se s ním tady hodně naučíme, hahaha.
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ů.
o:
pro i v $ (ls -d /path/a/folder/*.ext); dělat PŘÍKAZ „$ i“; Hotovo;
To vypadá dobře, ale pokud názvy souborů obsahují mezery, nefunguje to. 🙂
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ářů.
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.
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.
Pokud si všimnete, že $ i je v uvozovkách. Díky tomu je únik mezer zbytečný.
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.
Velmi dobrý, složitý, ale velmi zajímavý.
to je úžasné, skvělé !!!!
Výborně, plasticita GNU / Linuxu nemá žádná omezení.
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