2010-06-30 4 views

Répondre

-4

Vous pouvez utiliser des expressions régulières lorsque la liste des fichiers:

ls [0-9]* 

Ce fut une approche simple et minimaliste au problème ci-dessus, mais je pense une meilleure solution est

ls -al | grep -E '^[0-9]+\.php$' 

comme UncleZeiv explique below.

+2

Sûrement cela dépend de la coquille? Par exemple 'bash' ne traiterait pas cela comme une expression régulière. Essayez-le et vous verrez qu'il correspond à _any_ fichier dont le nom commence par un nombre. – Troubadour

+0

En fait, je cours bash et cela a fonctionné parfaitement. C'était beaucoup trop simple. Merci pour la solution. J'ai utilisé cp [0-9] * – gurun8

+0

@ gurun8: Vous avez eu de la chance de n'avoir aucun fichier avec des caractères non-numériques dans leur nom alors. – Troubadour

6

Modifier comme ceci:

ls -al | grep -E '^[0-9]+\.php$' 

-E active les expressions régulières étendues.

exige qu'au moins une occurrence du groupe précédent apparaisse. Point d'échappement sinon cela signifie "n'importe quel caractère."

^ et $ de faire correspondre le nom de fichier complet et pas seulement une partie. Guillemets simples pour empêcher l'expansion de variables (il se plaindrait à cause de $).

+2

Ne pas utiliser 'ls' dans les scripts, il est uniquement destiné à un usage interactif. – Philipp

+0

@Philipp: Personne n'a mentionné les scripts. – Troubadour

+1

@Troubadour: Le tube dans 'grep' en fait un" script ". –

4

Utiliser find:

$ find . -regex '^[0-9]+\.php' -exec mv '{}' dest/ ';' 

Notez que l'argument -regex fait une recherche, pas un match, ce qui explique pourquoi le^est là pour ancrer le début. Cela suppose également que les fichiers se trouvent dans le même répertoire (.) Que celui dans lequel vous vous trouvez lorsque vous exécutez la commande.

La ruse {} dans la commande mv est remplacé par find avec le nom de fichier trouvé.

+1

+1 pour l'utilisation de find – zdav

+2

mais pas de +1 pour l'utiliser de cette façon. Cela va casser les noms de fichiers avec des espaces ou des sauts de ligne. Au lieu de cela, utilisez 'find. -regex '^ [0-9] + \. php' -exec mv '{}' dest/';' ', ou' xargs -0'. – Philipp

+0

@Philipp: Merci, c'est plus robuste. J'ai eu l'impression que l'ensemble des noms de fichiers de l'affiche originale ne contenait pas d'espaces, mais être sûr, c'est mieux, bien sûr. – unwind

2

Soit utiliser find (éventuellement combiné avec les -XXXdepth options):

find . -mindepth 1 -maxdepth 1 -regex '^[0-9]+\.php' -exec mv '{}' dest/ ';' 

Ou utiliser les capacités BUILTIN regex:

pattern='^[0-9]+\.php$' 
for file in *.php 
do 
    [[ $file =~ $pattern ]] && echo "$file" 
done 

Ne pas utiliser ls ou grep.

7

Dans Bash, vous pouvez utiliser la correspondance de motif étendu:

shopt -s extglob 
ls -l +([0-9]).php 

qui trouvera des fichiers tels que:

123.php 
9.php 

mais pas

a.php 
2b.php 
c3.php 
Questions connexes