![]() |
Bonjour et bienvenu par les États-Unis à la UNIX et Linux Forums! Merci de votre visite et vous joindre à notre communauté mondiale.
|
|
google unix.com
|
|||||||
| Forums | S'inscrire | Forum Rules | Liens | Albums | FAQ | Liste des membres | Calendrier | Recherche | Aujourd'hui, les postes | Marquer les forums comme lus |
| De programmation et de script Shell Posez vos questions à propos de KSH, CSH, SH, BASH, PERL, PHP, SED, awk et d'autres scripts shell et les langages de script shell ici. |
Plus d'UNIX et Linux Forum Sujets Vous trouverez peut-être utile
|
||||
| Fil | Thread Starter | Forum | Réponses | Last Post |
| gzcat en awk et puis changer le nom de fichier et de nouveaux processus FILENAME | timj123 | De programmation et de script Shell | 6 | 06-23-2008 08:45 AM |
| partie d'un nom de fichier | flame_eagle | De programmation et de script Shell | 8 | 02-28-2008 11:18 AM |
| Rapport de la duplication des fichiers basés sur une partie du nom du fichier | sudheshnaiyer | UNIX pour les nuls Questions et réponses | 1 | 12-18-2007 04:31 PM |
| lire une partie du nom de fichier de la liste dans le script | happyv | De programmation et de script Shell | 3 | 10-20-2006 10:58 AM |
| Recherché pour éliminer la partie numérique d'un nom de fichier | Sona | UNIX pour les nuls Questions et réponses | 8 | 07-20-2006 03:49 PM |
![]() |
|
|
LinkBack | Thread Tools | Recherche sur ce Thread | Rate Thread | Modes d'affichage |
|
|
|
||||
|
la détection de la part d'un nom de fichier
J'aime avoir la date dans le format 2008-09-01 au début de mes fichiers. J'ai ensuite, après que les césures et alors mon nom de fichier.
J'ai un script qui crée pour moi. Cependant, je mai travailler sur des dossiers qui ont déjà le format de la date déjà là et je ne veux pas avoir un jour à deux reprises. Existe-t-il un moyen de détecter un nombre ou au début du nom du fichier et, si oui, puis découpez la date? |
|
||||
|
C'est là, au lieu de cela, les dates sont salissants
Code:
echo $filename | \
sed 's/\(^[1-2][0-9]\{3\}\)-\([0-1][0-9]\)-\([0-3][0-9]\)-\([A-Z_0-9a-z]*\)/\4/' | read newfilename
if [[ ! -z newfilename ]] ; then
filename=$newfilename
fi
ls-l place. Chris était techniquement correct, sans doute -, mais l'utilité de la ci-dessus est limitée. En partie, cela est dû à la façon dont les dates sont construites - et de la regex ci-dessus n'est pas parfaite. Il pense 2008-19-19 est une date - qui ne l'est pas. La plupart date regexes sont plusieurs centaines de caractères de long. La seule règle d'or est de se référer à la sortie de cal. Nous utilisons le cadre de cette date de vérifier l'algorithme ci-dessous (très simplifié) de la validation des anciennes dates. C'est plus près complète et correcte et que la plupart des applications en utilisant directement shell regex sont susceptibles de l'être. J'ai délibérément exclu Code:
/* chpdt.c
usage chpdt filename
echo "$filname" | chpdt
*/
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <stdio.h>
#define isleapyr(y) (((y) % 4) == 0 && ((y) % 100) != 0 || ((y) % 400) == 0)
int leap[12]= {31,29,31,30,31,30,31,31,30,31,30,31};
int nleap[12]={31,28,31,30,31,30,31,31,30,31,30,31};
char *date_ok(char *result, char *src)
{
int value=atoi(src);
int month=0;
char *p=src;
int *v=nleap;
if( value >= 1900 && value < 2038 && (p=strchr(p, '-')) != NULL )
{
if(isleapyr(value))
v=leap;
value=atoi(++p);
if(value >= 1 && value < 13 && (p=strchr(p, '-')) != NULL)
{
month=value;
value=atoi(++p);
if( value > 0 && value < v[ month - 1 ] )
if( (p=strchr(p, '-')) != NULL)
result=++p;
}
}
return result;
}
char *name_ok(char *p, char *src)
{
if(src[4]=='-' && src[7]=='-' && src[10]=='-')
p=date_ok(p, src);
return p;
}
int main(int argc, char **argv)
{
int retval=0;
char tmp[PATH_MAX + 2]={0x0};
char *p=NULL;
if (argc < 2)
{
if(fgets(tmp, sizeof(tmp), stdin) ==NULL)
{
perror("I/O error");
retval=1;
};
p=strchr(tmp, '\n');
if(p!=NULL)
*p=0x0;
}
else
(void)strncpy(tmp, argv[1], PATH_MAX);
p=tmp;
if(strlen(tmp) > 10 && !retval) /* will return zero length if string is "date-"*/
p=name_ok(p, tmp);
if( fprintf(stdout, "%s", p) < 0)
{
perror("I/O error");
retval=1;
}
return retval;
}
|
|
||||
|
Merci les gars. Je suis allé avec Chris solution. Elle est limitée, comme vous avez dit Jim (vous devez avoir la syntaxe exacte pour que ça fonctionne), mais Jim votre solution est bien au-dessus de ma tête pour un débutant! Pour ce que je fais de Chris fera très bien. Merci à vous tous.
|
![]() |
| Bookmarks |
| Thread Tools | Recherche sur ce Thread |
| Modes d'affichage | Rate this thread |
|
|