2009-03-10 11 views
0

Si j'ai une variable BASH:répertoire de filtre liste avec script shell

Exclude="somefile.txt anotherfile.txt" 

Comment puis-je obtenir le contenu d'un répertoire, mais exclure les fichiers ci-dessus pour la liste? Je veux être capable de faire quelque chose comme:

Files= #some command here 
someprogram ${Files} 

someprogram doit être donné tous les fichiers dans un répertoire particulier, à l'exception de ceux de la variable ${Exclude}. La modification de someprogram n'est pas une option.

Répondre

2

Je ne suis pas sûr si vous prenez à propos unix script shell, mais voici un exemple de travail pour bash:

#!/bin/bash 

Exclude=("a" "b" "c") 
Listing=(`ls -1Q`) 

Files=($(comm -23 <(printf "%s\n" "${Listing[@]}") <(printf "%s\n" "${Exclude[@]}" 
))) 

echo ${Files[@]} 

Notez que j'enfermai chaque nom de fichier dans Exclude avec des guillemets doubles et ajouté parenthèses autour d'eux. Remplacez echo par someprogram, remplacez la commande ls par le répertoire que vous souhaitez examiner et vous devriez le faire fonctionner. Le programme comm est la clé, ici.

+0

Cela semble être la solution la plus simple car elle ne nécessite pas de boucle. – dreamlax

1

Vous pouvez utiliser find. quelque chose comme:

FILES=`find /tmp/my_directory -type f -maxdepth 1 -name "*.txt" -not -name somefile.txt -not -name anotherfile.txt` 

où/tmp/mon_directory est le chemin que vous souhaitez rechercher.

Vous pouvez construire la liste « -non -nom bla -non -nom blah2 » de l'exclusion si vous voulez une simple boucle ...

+0

est de trouver portable sur les plates-formes unix-like? BSD, Linux, etc. – dreamlax

0

est ici une seule ligne pour une norme ligne de commande Unix:

ls | grep -v "^ $ {Exclure} $" | xargs

Il a une seule hypothèse. $ {Exclude} doit être correctement échappé pour que les charaters comme period ne soient pas interprétés comme faisant partie de l'expression rationnelle.

+0

Cela fonctionnerait si j'avais seulement un fichier que je voulais exclure, mais je pourrais en avoir jusqu'à 10 (mais je ne veux pas placer de limite arbitraire sur les fichiers exclus). – dreamlax

0

En supposant que les noms de fichiers sans espaces ou d'autres caractères pathologiques:

shopt -s extglob 
Files=(!(@(${Exclude// /|}))) 
Questions connexes