Individuare i file che contengono solo caratteri stampabili in script bash
-
04-10-2019 - |
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
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