Domanda

Sto cercando di scrivere uno script bash che guarda una directory piena di file e li categorizza sia come plaintext o binario. Un file di testo in chiaro è se contiene solo caratteri di testo in chiaro, altrimenti è binario. Finora ho provato le seguenti permutazioni di grep:

#!/bin/bash
FILES=`ls`
for i in $FILES
do
    ########GREP SYNTAX###########
    if grep -qv -e[:cntrl:] $i
    ########/GREP SYNTAX##########
    then
        mv $i $i-plaintext.txt
    else
        mv $i $i-binary.txt
    fi
done

Nella riga della sintassi grep, ho anche provato la stessa senza il flag -v e scambiando i rami del if, così come entrambe le combinazioni degli stessi con [: alnum:] e [: print:]. Tutti e sei queste variazioni producono alcuni file etichettati binario goduto riguardano esclusivamente plantext e alcuni file di testo in chiaro marcato che contengono almeno un carattere non stampabile.

Ho bisogno di trovare un modo per identificare i file che solo contenere caratteri stampabili vale a dire A-Z, a-z, 0-9, punteggiatura, spazi e nuove linee. Tutti i file che contengono qualsiasi carattere che non è in questo set shoudl essere classificati come binario.

mi è stato bashing la testa contro un muro cercando di risolvere questo per una mezza giornata. Aiuto! Grazie in anticipo, Rik

È stato utile?

Soluzione

In primo luogo si può / deve fare

for f in *

invece di mettere l'output di ls in una variabile. La ragione principale per farlo è quello di essere in grado di gestire i nomi di file che includono spazi.

In secondo luogo, è necessario racchiudere la classe di caratteri in un set di staffe o sta andando a guardare a quei personaggi come letterali. E io li racchiudere in un insieme di singoli apici per la protezione contro il guscio interpretarli. Non utilizzare -v e negare la classe print e vedere se funziona per voi.

if grep -aq -e '[^[:print:]]' "$f"

E come mostrato in quella linea, citare sempre le variabili quando contengono i nomi dei file.

mv "$f" "$f-plaintext.txt"

Per mantenere grep da lamentarsi file binari, l'uso -a.

Il i variabile viene spesso utilizzato per un numero intero o un indice. Utilizzare f o file.

Infine:

#!/bin/bash
for f in *
do
    if grep -aq -e '[^[:print:]]' "$f"
    then
        mv "$f" "$f-binary.txt"
    else
        mv "$f" "$f-plaintext.txt"
    fi
done

Altri suggerimenti

È possibile utilizzare l'opzione -I di grep che tratterà file binari come file senza una partita e basta usare un espressione regolare che sarà sempre corrispondere (come la stringa vuota):

if grep -qI -e '' $i
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top