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
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
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
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
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.
ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"
END
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.
In verità, hai una grande conoscenza dei comandi di Linux. Molto utile!
Sì, so che impareremo molto con lui qui intorno ahahah.
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.
o:
for i in $ (ls -d /path/a/folder/*.ext); do COMANDO "$ i"; fatto;
Sembra buono, ma se i nomi dei file contengono spazi vuoti non funziona. 🙂
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.
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.
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.
Se noti che $ i è tra virgolette. Ciò rende superfluo l'evasione degli spazi bianchi.
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.
Molto buono, complesso, ma molto interessante.
questo è fantastico, fantastico !!!!
Eccellente, la plasticità di GNU / Linux non ha limiti.
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