Trova / Unrar / Elimina script

2

Sono un PC convertito e abbastanza esperto quando si tratta di shell / bash scripting, ma voglio davvero imparare / capire di più.

La mia necessità: devo essere in grado di scansionare una cartella, trovare qualsiasi file .rar, estrarre i file sul posto ed eliminare il .rar associato in seguito. Ognuno può anche avere i file .r00, .r01, ... associati, quindi anche quelli devono essere cancellati in seguito.

Qualcuno può aiutarmi a capire (e capire) come scrivere uno script per questo? Più commenti, meglio è.

    
posta Jason T Featheringham 25.03.2013 - 06:20
fonte

3 risposte

3

Suppongo che tu voglia solo scansionare la cartella corrente (e non tutte le altre cartelle sottostanti):

for rarfile in *.rar; do
    unrar x "$rarfile"
done

La cosa fondamentale è mettere il nome del file in "" quando lo si passa a unrar per evitare problemi con gli spazi nel nome.

Ora se vuoi che questo script sia eseguibile, puoi fare quanto segue

 cd ~
 mkdir .bin 
 echo 'PATH=$PATH:$HOME/.bin' >> .profile
 echo 'export PATH' >> .profile
 . ./.profile
 nano .bin/extract_all_rars

Questo ti dà un semplice editor per i file di testo, i comandi essenziali sono visualizzati in basso. Tipo

 #!/bin/bash

seguito dal blocco di codice in alto, salvare il file ed uscire. Quindi (di nuovo nella shell) digita

 chmod +x .bin/extract_all_rars

per contrassegnarlo come eseguibile (quindi la shell lo riconosce come un comando).

La cancellazione automatica ha un avvertimento: unrar non restituisce uno stato di errore se le cose vanno male, quindi potresti perdere i tuoi file rar. Se questo non è un problema, aggiungendo

 rm -f "$rarfile" ${rarfile%%.rar}.r{0..9}{0..9} 

dopo che unrar nel ciclo sopra farà il lavoro. Il secondo parametro viene utilizzato per creare tutti i suffissi .r04 eliminando dapprima il suffisso ( ${rarfile%%.rar} ) e quindi ripetendo da 0 a 9 due volte per ottenere tutte le combinazioni possibili (esegui echo foo{0..9} in bash per vedere come funziona) . Poiché la maggior parte di questi nomi di file non esiste, ho aggiunto -f come opzione per evitare messaggi di errore.

Se sei abbastanza sicuro che nessun altro file con un suffisso .rXX si trovi nella stessa directory, un semplice

rm -${rarfile%%.rar}.r??

fa anche il trucco.

Se non hai già rar / unrar :

  • Scarica RAROSX 4.2 da rarlab.com
  • Nel Finder, apri ~/Downloads e fai doppio clic sul file scaricato per decomprimere. Verrà creata una cartella rar
  • Apri Terminale ed esegui i seguenti comandi

    cd ~/Downloads/rar
    sudo install -d rar unrar /usr/local/bin
    

    per installare i file binari (eseguibili)

  • Dobbiamo anche assicurarci che la shell in seguito trovi i binari

    cd ~
    echo 'PATH=$PATH:/usr/local/bin' >> .profile
    echo 'export PATH' >> .profile
    . ./.profile
    
risposta data 25.03.2013 - 06:51
fonte
4

potresti fare qualcosa di simile a questo:

find . -iname '*.rar' | xargs unrar x

find . -iname '*.r*' | xargs rm -f

lo script funziona come segue: cerca in modo ricorsivo i file rar nella directory in cui ti trovi (il punto) Conduce tutti i risultati a un elenco di argomenti (xarg) che viene passato al comando 'unrar'

Lo stesso nella seconda riga, ma ora è passato per rimuovere (rm). Il flag -f si assicura che i file vengano cancellati all'istante, non ti verrà chiesta la tua autorizzazione. Rm -f è un comando potente che dovresti usare con attenzione, quindi pensa a cosa sarebbe rimosso se lo eseguissi prima di cancellarlo, o semplicemente testandolo facendo:

find . -iname '*.r*'

Una cosa sul comando unrar: unrar non è un comando standard in Mac OSX (non è sicuro se questo è il caso in altre distribuzioni Linux / Unix), quindi assicurati di averlo installato sul tuo computer.

Nota: esiste una differenza sottile ma importante tra find . -iname *.r* e find . -iname '*.r*' relative al modo in cui le shell Unix gestiscono i caratteri jolly:

  • Nel primo modulo, i caratteri jolly vengono espansi dalla shell (quindi la shell cercherà tutti i file / cartelle corrispondenti a *.r* nella directory corrente e li passerà come parametri a find . Funzionerà bene se c'è un file per uguagliare, ma fallirà se ce ne sono diversi (perché la chiamata è find . -iname foo.rar bar.rar ma -iname prende solo un argomento).
  • Nella seconda forma il pattern (senza '' ) viene passato a find e l'espansione jolly è fatta da find (che poi cerca di trovare ogni file trovato).

Quindi in generale i modelli passati a find devono essere racchiusi in '' per produrre il risultato desiderato.

    
risposta data 25.03.2013 - 06:49
fonte
1

Uso unar , che è una versione da riga di comando di The Unarchiver.

Funzionano anche con percorsi che contengono spazi:

find . \( -name \*.rar -o -name '*.r[0-9][0-9]' \) -print0 | xargs -0 unar
find . -name '*.r[a0-9][r0-9]' -exec unar {} \+
find . -name '*.r*' -delete

O se installa Bash 4 e aggiungi shopt -s globstar a ~/.bash_profile :

unar **/*.r*
shopt -s extglob; printf %s\n **/*.@(rar|r[0-9][0-9])
rm **/*.r[a0-9][r0-9]
    
risposta data 26.03.2013 - 18:38
fonte

Leggi altre domande sui tag