2016-03-31 1 views
0

Je dois trier et imprimer tous les noms de fichiers de fichiers ASCII d'un dossier donné. Je l'ai fait jusqu'ici mais les noms de fichiers sont imprimés même s'il s'agit d'images PNG.Déterminez si le type de fichier est en texte ASCII dans bash

#!/bin/bash 

for f in $1/* 
do 
nume=$(basename $f) 

if [ 'file $nume'=="$1/$nume: ASCII text" ]; then 
    echo $nume 
fi 
done 

Quelqu'un peut-il expliquer ce qui ne va pas avec mon code?

+1

Est-ce que vous comprenez pourquoi '$ (...) 'est utilisé pour lancer' basename'? La même raison s'applique à l'exécution de 'file'. – chepner

Répondre

3
  1. [ veut juste un signe égal, pas deux, et il doit être séparés par des espaces (voir help test):

    [ 'file $nume' = "$1/$nume: ASCII text" ] 
    
  2. Vous devez $(...) pour obtenir la sortie d'une commande:

    [ "$(file $nume)" = "$1/$nume: ASCII text" ] 
    
  3. Pourquoi utilisez-vous basename? file ne va pas trouver votre fichier si vous ne donnez pas tout le chemin:

    for f in $1/* 
    do 
        if [ "$(file $f)" = "$f: ASCII text" ]; then 
         echo $f 
        fi 
    done 
    
  4. toujours vos extensions citer. Citant peut vous faire économiser beaucoup de maux de tête:

    for f in "$1"/* 
    do 
        if [ "$(file "$f")" = "$f: ASCII text" ]; then 
         echo "$f" 
        fi 
    done 
    
  5. (Facultatif) Personnellement, je prendrais avantage de [[ et correspondance des expressions rationnelles:

    if [[ "$(file "$f")" =~ ': ASCII text'$ ]]; then 
    
+0

6. Je profiterais de 'case $ (fichier" $ f ") dans * texte) echo matched ;; *) echo aucune correspondance sur le texte ;; esac'; -) Notez que même avec un nom de fichier contenant des espaces, il suffit de dbl-citer "$ f", pas la sortie complète de $ (fichier "$ f") '. Bonne chance à tous. – shellter