La bonne solution serait plutôt d'utiliser find,
ls n'est qu'un outil de *formatage* pour l'utilisateur, il ne devrait pas être utilisé pour les traitements par lots.
De plus, ls est sensible à l'environnement utilisateur (LS_OPTIONS, TIME_STYLE, etc..). Il faut donc penser à lui demander d'ignorer tout cela, ce qui devient vite fastidieux.
Ou alors d'utiliser directement l'expansion shell :
for file in * ; do echo $file | ... ; done
ça à l'énorme avantage de conserver les échappements. Par contre ça ne prend pas les fichiers commençant par un ".". Et si on fait :
for file in * .* ; do .... ; done
s'il n'y a pas de fichiers / dossier qui matche .* ou *, on obtient une erreur, ce qui est gênant.
en plus, ni cette solution, ni ton ls ne gère le cas où tu te retrouves avec un répertoire dans la liste. Et rm va pas être content, du coup. :-)
D'où : find est donc la seule vraie bonne solution.
Ensuite, tous tes grep | grep | grep | ... pourraient être regroupés en deux grep "A|B|C" | grep -v "D|E|F"ce qui serait plus propre.
Mais comme dit, "find" permet de regrouper tous les matches en une seule commande.
find -maxdepth 1 -type f ( -name "A" -o -name "B" ) -a ( ! -name "C" -a ! -name "D" ... ) -exec rm '{}' ';'
[^] # find
Posté par Hugues Hiegel (site web personnel) . En réponse au message action sur le résultat d'une commande. Évalué à 3.
ls n'est qu'un outil de *formatage* pour l'utilisateur, il ne devrait pas être utilisé pour les traitements par lots.
De plus, ls est sensible à l'environnement utilisateur (LS_OPTIONS, TIME_STYLE, etc..). Il faut donc penser à lui demander d'ignorer tout cela, ce qui devient vite fastidieux.
Ou alors d'utiliser directement l'expansion shell :
for file in * ; do echo $file | ... ; done
ça à l'énorme avantage de conserver les échappements. Par contre ça ne prend pas les fichiers commençant par un ".". Et si on fait :
for file in * .* ; do .... ; done
s'il n'y a pas de fichiers / dossier qui matche .* ou *, on obtient une erreur, ce qui est gênant.
en plus, ni cette solution, ni ton ls ne gère le cas où tu te retrouves avec un répertoire dans la liste. Et rm va pas être content, du coup. :-)
D'où : find est donc la seule vraie bonne solution.
Ensuite, tous tes grep | grep | grep | ... pourraient être regroupés en deux grep "A|B|C" | grep -v "D|E|F"ce qui serait plus propre.
Mais comme dit, "find" permet de regrouper tous les matches en une seule commande.
find -maxdepth 1 -type f ( -name "A" -o -name "B" ) -a ( ! -name "C" -a ! -name "D" ... ) -exec rm '{}' ';'
à adapter selon tes besoins, évidemment.