Come utilizzare i comandi che funzionano solo con un file alla volta con tutti i file selezionati

Molte volte abbiamo bisogno di eseguire uno script per convertire un pdf in testo, convertire i file .doc in html, ecc; il punto è che questi comandi accettano solo un file alla volta e questo è molto noioso per noi se dobbiamo eseguire la stessa operazione su più file, specialmente quando facciamo uno script.

Propongo una soluzione per questo problema utilizzando ls, sete, grep, awk y sh. Quello che faremo è creare la riga di comando corretta in ogni riga ed eseguirli con sh, e poiché sh eseguirà una riga alla volta, il consumo di memoria ram non aumenterà, il che con altri metodi può persino congelare le macchine sottodimensionate.

Vediamo come eseguire questa sequenza di comandi.

1- La prima cosa che dobbiamo fare è introdurre i file che verranno utilizzati attraverso ls:

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

2- Quindi avremo bisogno di questi file per passare le virgolette «/ percorso / al gruppo di
File«

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

3- Ora awk sarà pronto per ricevere i dati.

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

perché awk ha la sua lingua avremo bisogno di separare le virgolette che vogliamo che appaiano per citare un testo tra le altre funzioni avremo bisogno di usare la barra rovesciata \ Vediamo come separarne alcuni.
Separare una citazione

\”

Mostra una barra rovesciata nell'output (dovremo digitare tre barre)

\\\

A volte avremo bisogno di un separatore di isolamento, solo il testo o le virgolette che compaiono all'interno delle due barre rovesciate verranno emesse nell'output:

'""'\"\'""'

4- Vediamo come rinominare tutti i file che vengono elencati utilizzando il comando mv solo per inserire un suffisso. (Ora per elencare il file dovremo usare la combinazione "$ 0" ogni volta che ne avremo bisogno)

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

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

La nota viene aggiunta alla fine come mostrato nella sequenza precedente la combinazione « | SH »Che reindirizza la pipeline a questo interprete dei comandi

Vediamo alcuni esempi preparati per creare uno script.

Esempi:

1- Converti tutti i PDF elencati in file di testo.

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

In questo caso non è necessario selezionare un file di output poiché pdftotext genera automaticamente un file di testo con il nome di base e l'esenzione .txt se e solo se stai lavorando con un singolo file.

2- Diciamo che vogliamo applicare un effetto ad un'immagine ma senza modificare l'originale, vediamo un esempio con l'effetto onda ben noto per il logo di Windows XP, visto che si tratta di una bandiera con effetti ondulati (per apprezzare meglio questo effetto è consigliato da utilizzare come immagine risultante con l'estensione .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

Nota: in questa sequenza vengono eseguite diverse passate:

  • Uno per ottenere la cartella in cui si trova il file con dirname
  • Un altro per ottenere il nome di base, ma rimuovendo l'estensione di detto file
  • Un altro per ottenere l'esenzione di detto file.

3- Vediamo ora come rinominare un gruppo di file mettendo il numero corrispondente davanti al nome (suffisso numerico).

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

Per inserire il numero, è stato utilizzato il linguaggio interno di awk con l'opzione "FNR" che elenca ogni riga di output, quindi il numero può essere posizionato prima o dopo il testo.

Vediamo come mettere un prefisso numerico (mettere un numero alla fine, ma prima dell'esenzione) questa opzione è valida solo se il file ha l'estensione.

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- Vediamo un esempio in cui dovremo inserire dati o selezionare un gruppo di funzioni, prendendo come esempio il caso in cui rimuoviamo la protezione con password da più file pdf che hanno la stessa password. (In questo caso useremo zenity come finestra di dialogo)

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 seconda della versione di zenity, l'opzione per la password può essere solo –pasword.

Come hai visto, l'obiettivo è quello di creare un gatto di un file che verrà creato all'inizio della riga una sola volta e poi verrà cancellato una volta completata la conversione.

5- Un'altra utilità è, quando abbiamo bisogno di decomprimere diversi file compattati in .zip

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

Le virgolette aggiuntive devono essere separate da uno spazio in cui viene utilizzata l'opzione "$ 0".
Ejemplo
"unzip -x "$0" "

6- Vediamo un esempio per proteggere un pdf con una password, consentendone la lettura ma protetto contro la stampa, copia o altre opzioni, (le opzioni elencate nella finestra di dialogo saranno quelle che saranno consentite nel pdf, se non si desidera consentire di loro, non selezionarne nessuno).

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

Con questi esempi è abbastanza esemplificato come utilizzare questa opzione per convertire, modificare o rinominare più file con un unico script e non convertirli manualmente uno per uno. Il consumo di memoria con questa opzione è minimo, a seconda del comando che si sta utilizzando, poiché non li converte contemporaneamente ma uno dopo l'altro.

Questa opzione può essere molto utile se vogliamo convertire un intero gruppo di video con mencoder senza che questo li unisca in uno solo; puoi preparare uno script per questo e dovrebbero solo mettere ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

END


Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.

  1.   Ramiro suddetto

    Non sarebbe molto, ma MOLTO più facile fare tutto questo usando espressioni regolari o caratteri jolly? Non capisco quale sia la differenza tra questo e rendere la tua vita così complicata con questo.

  2.   crotus suddetto

    In verità, hai una grande conoscenza dei comandi di Linux. Molto utile!

    1.    KZKG ^ Gaara suddetto

      Sì, so che impareremo molto con lui qui intorno ahahah.

  3.   hexborg suddetto

    Penso che sia molto più semplice:

    ls -d /path/to/folder/*.ext | durante la lettura del file; fare COMANDO "$ file"; fatto

    Invece di COMMAND puoi mettere quello che vuoi e funziona anche se i file contengono spazi vuoti purché metti $ file tra virgolette. Non è necessario utilizzare sed per questo o generare i comandi con awk. Anche questo avvia un minor numero di processi.

    1.    Ankh suddetto

      o:
      for i in $ (ls -d /path/a/folder/*.ext); do COMANDO "$ i"; fatto;

      1.    hexborg suddetto

        Sembra buono, ma se i nomi dei file contengono spazi vuoti non funziona. 🙂

        1.    tahed suddetto

          In effetti, hexborg è il motivo per cui il testo di output è citato all'inizio e alla fine di ogni riga con questa opzione:
          ls –directory | sed 's / ^ / »/' | sed 's / $ / »/"

          Chiarisco che find può essere utilizzato per cercare nelle sottodirectory.

          1.    hexborg suddetto

            Ma con il mio trucco non devi. ls prende i nomi completi dei file uno su ogni riga e legge riga per riga e lascia il nome del file nella variabile del file, indipendentemente dal fatto che abbia spazi vuoti o meno. Hai solo bisogno di inserire virgolette intorno a $ file quando lo usi nel comando.

          2.    Hugo suddetto

            Sono d'accordo che in trovare può essere meno ingombrante. Prendiamo questo esempio dall'articolo:

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

            Lo stesso potrebbe essere ottenuto in questo modo, e probabilmente funziona più velocemente:

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

            Detto questo, l'articolo è il benvenuto, è sempre bene conoscere modi alternativi di fare qualcosa.

        2.    Ankh suddetto

          Se noti che $ i è tra virgolette. Ciò rende superfluo l'evasione degli spazi bianchi.

          1.    hexborg suddetto

            Sì, ma l'operatore $ () espande i nomi dei file senza mettere virgolette ovunque, quindi la variabile i cattura già i nomi dei file tagliati. Provalo in un terminale in una directory che contiene file con spazi nei nomi.

  4.   Leone suddetto

    Molto buono, complesso, ma molto interessante.

  5.   helena_ryu suddetto

    questo è fantastico, fantastico !!!!

  6.   msx suddetto

    Eccellente, la plasticità di GNU / Linux non ha limiti.

  7.   Natalia suddetto

    Caro blogger,

    Sono Natalia, Communications Manager di Paperblog. Dopo averlo scoperto, mi metto in contatto con te per invitarti a conoscere il progetto Paperblog, http://es.paperblog.com, un nuovo servizio di citizen journalism. Paperblog è una piattaforma digitale che, come una rivista di blog, pubblica i migliori articoli dei blog registrati.

    Se il concept ti interessa, devi solo proporre il tuo blog per partecipare. Gli articoli sarebbero accompagnati dal tuo nome / pseudonimo e dal file del profilo, oltre a diversi link al blog originale, all'inizio e alla fine di ciascuno. I più interessanti possono essere selezionati dal team per apparire in copertina e tu puoi essere selezionato come Autore del giorno.

    Spero che siate motivati ​​dal progetto che abbiamo avviato con tanto entusiasmo nel gennaio 2010. Date un'occhiata e non esitate a scrivermi per maggiori dettagli.

    Ricevi un saluto cordiale e affettuoso,
    Natalia