2010-09-19 9 views
2

J'ai une question assez simple, mais pas de conseils encore à travers les forums ou bash. La question est la suivante:nom de fichier bash commencer à correspondre

Je veux ajouter une chaîne de préfixe à chaque nom de fichier dans un répertoire qui correspond à * .h ou * .cpp. Cependant, si le préfixe a déjà été appliqué au nom de fichier, ne l'appliquez PAS à nouveau.

Pourquoi le suivant ne fonctionne pas est quelque chose qui n'a pas encore compris:

for i in *.{h,cpp} 
do 
if [[ $i!="$pattern*" ]] 
then mv $i $pattern$i 
fi 
done 

Répondre

2

vous pouvez essayer ceci:

for i in *.{h,cpp} 
do 
if ! (echo $i | grep -q "^$pattern") 
# if the file does not begin with $pattern rename it. 
then mv $i $pattern$i 
fi 
done 
+0

Oui, cela va le faire - même si cela a pour effet secondaire d'afficher la sortie de grep sur le shell , stdin) - devra désactiver cela – Display

+0

@Display; grep -q le fera pour vous. Bien que, c'est une solution assez consommatrice de ressources. Heureusement, l'écho est intégré, donc il va se raser une partie du temps. Examiner les chaînes directement serait préférable cependant. – falstro

+0

True. Je préférerais ne pas utiliser d'écho non plus. – Display

0
for i in *.{h,cpp}; do 
    [ ${i#prefix} = $i ] && mv $i prefix$i 
done 

conforme pas exactement à votre script, mais il devrait fonctionner. La vérification renvoie vrai s'il n'y a pas de préfixe (c'est-à-dire si $ i, avec le préfixe "préfixe" supprimé, est égal à $ i).

+0

Le préfixe $ {i #} devrait être $ {i # $ préfixe}. Mais autrement cela fonctionne. Merci. – Display

+0

@Affiche; non, ça devrait peut-être être $ pattern, je faisais référence au préfixe littéral bien. – falstro

+0

$ dans les deux endroits que 'préfixe' est utilisé ci-dessus, oui. – Display

1
#!/bin/sh 
pattern=testpattern_ 
for i in *.h *.cpp; do 
    case "$i" in 
    $pattern*) 
     continue;; 
     *) 
     mv "$i" "$pattern$i";; 
    esac 
done 

Ce script sera exécuté dans une shell Posix, non seulement bash. (Je n'étais pas sûr si votre question était "pourquoi ça ne marche pas" ou "comment je fais ce travail" donc j'ai deviné que c'était la seconde.)

2

D'autres ont montré des comparaisons de remplacement qui fonctionnent; Je vais essayer de comprendre pourquoi la version originale ne l'a pas été. Le test de préfixe d'origine présente deux problèmes: vous avez besoin d'espaces entre l'opérateur de comparaison (!=) et ses opérandes, et l'astérisque est entre guillemets (ce qui signifie qu'il est littéralement apparié, plutôt que comme caractère générique). Corrigez-les, et (au moins dans mes tests) cela fonctionne comme prévu:

if [[ $i != "$pattern"* ]] 
Questions connexes