Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Shell : obtenir le nom d'un répertoire particulier

10 réponses
Avatar
Xavier MOGHRABI
Bonjour

Je souhaite écrire une commande dans un shell pour obtenir le nom d'un
répertoire particulier.

Dans un repertoire j'ai des répertoires numérotés de la sorte :
/u/archives
./04092109
./04091512
./04090818
./04083109
./04082611
./04081611
./04073010

Les numérotations des répertoires correspondent à leur date de création.
AAMMJJHH

Je souhaiterais obtenir le nom du répertoire donc le nom correspond à la
date est la plus récente.

Avec la commande suivante :
>find /u/archives -maxdepth 1 -regex "/u/common/jarchives/[0-9]+" | sort -r
-n

j'obtiens la liste des répertoires ordonnées du plus récent au plus ancien :
/u/archives/04092109
/u/archives/04091512
/u/archives/04090818
/u/archives/04083109
/u/archives/04082611
/u/archives/04081611
/u/archives/04073010

Toutefois je souhaite obtenir seulement le 1er résultat.

Comment puis-je faire ?

merci pour vos réponses

--
Xavier MOGHRABI - Consortium ObjecWeb
Email : xavier.moghrabi at inrialpes.fr
Phone : +33 4 76 61 55 25

10 réponses

Avatar
Xavier MOGHRABI
Comment puis-je faire ?


find /u/archives -maxdepth 1 -regex "/u/common/jarchives/[0-9]+" | sort -r
-n | head -n 1

merci Laurent pour ta réponse
--
Xavier MOGHRABI - Consortium ObjecWeb
Email : xavier.moghrabi at inrialpes.fr
Phone : +33 4 76 61 55 25

Avatar
[Sauron De Mordor]
Xavier MOGHRABI wrote:
Bonjour

Je souhaite écrire une commande dans un shell pour obtenir le nom d'un
répertoire particulier.

Dans un repertoire j'ai des répertoires numérotés de la sorte :
/u/archives
./04092109
./04091512
./04090818
./04083109
./04082611
./04081611
./04073010

Les numérotations des répertoires correspondent à leur date de création.
AAMMJJHH

Je souhaiterais obtenir le nom du répertoire donc le nom correspond à la
date est la plus récente.

Avec la commande suivante :

find /u/archives -maxdepth 1 -regex "/u/common/jarchives/[0-9]+" | sort -r


-n

j'obtiens la liste des répertoires ordonnées du plus récent au plus ancien :
/u/archives/04092109
/u/archives/04091512
/u/archives/04090818
/u/archives/04083109
/u/archives/04082611
/u/archives/04081611
/u/archives/04073010

Toutefois je souhaite obtenir seulement le 1er résultat.

Comment puis-je faire ?

merci pour vos réponses



la reponse donne est la moins optimale, imagine maintenant au bout de 2 ou 3 ans ce que ca donnera

un bete ls ou echo te donne deja les bonnes info


ls -ld /u/archives/*/ | sort | tail -n 1


la encore on peux optimiser si on veux pinaller

echo /u/archives/* | tr -s " " "n" | sort | tail -n 1
cette methode a l avantage de ne pas faire d acces disque (lstats) pour avoir les bonnes info, ce qui est tres

interessant quand on a qq centaines de milier ou des millions de fichier dans le repertoir.

pour infi le tail/head -# est devenu deprecated, il faut utiliser tail/head -n #


Avatar
Etienne de Tocqueville
Xavier MOGHRABI a écrit sur fr.comp.os.unix :

find /u/archives -maxdepth 1 -regex "/u/common/jarchives/[0-9]+" | sort -r
-n | head -n 1


Pourquoi un find ? Je ne comprends pas trop... Un simple « ls -rd
/u/archives/[0-9]* » me semble plus portable que ton find delamortquitue !

Avatar
Etienne de Tocqueville
"[Sauron De Mordor]" a écrit sur fr.comp.os.unix :

un bete ls ou echo te donne deja les bonnes info

ls -ld /u/archives/*/ | sort | tail -n 1


Sans l'option "l"

la encore on peux optimiser si on veux pinaller

echo /u/archives/* | tr -s " " "n" | sort | tail -n 1
cette methode a l avantage de ne pas faire d acces disque (lstats) pour
avoir les bonnes info, ce qui est tres interessant quand on a qq
centaines de milier ou des millions de fichier dans le repertoir.


Les deux solutions par ls ou echo me semblent identique si on n'utilise
pas l'option "l" pour le ls... Mais pour autant de fichier, aucune des 2
solutions ne marcherait, parce que la ligne de commande serait trop
longue. Par contre, on pourrait faire :

ls /u/archives/ | grep "^[0-9]" | tail -1

Cela dit, si on avait tant de fichier, il faudrait bien sur hiérarchiser
les fichiers en créant un répertoire par année, par mois et par jours

Avatar
[Sauron De Mordor]
Etienne de Tocqueville wrote:
"[Sauron De Mordor]" a écrit sur fr.comp.os.unix :


un bete ls ou echo te donne deja les bonnes info

ls -ld /u/archives/*/ | sort | tail -n 1



Sans l'option "l"
oui sans le l, question d abitude

mais en metant ls -1d on gangne en perf et on afiche sur 1 colonnne


la encore on peux optimiser si on veux pinaller

echo /u/archives/* | tr -s " " "n" | sort | tail -n 1
cette methode a l avantage de ne pas faire d acces disque (lstats) pour
avoir les bonnes info, ce qui est tres interessant quand on a qq
centaines de milier ou des millions de fichier dans le repertoir.



Les deux solutions par ls ou echo me semblent identique si on n'utilise
pas l'option "l" pour le ls... Mais pour autant de fichier, aucune des 2
solutions ne marcherait, parce que la ligne de commande serait trop
longue. Par contre, on pourrait faire :

ls /u/archives/ | grep "^[0-9]" | tail -1

Cela dit, si on avait tant de fichier, il faudrait bien sur hiérarchiser
les fichiers en créant un répertoire par année, par mois et par jours


si is ca marcherais pour le echo, j ai deja utiliser cela sur un alpha OSF1 avec 2 millions de fichier dans le repertoir.
et le ls (avec ou sans *) faisait core dump, apres avoir mouliner pdt 30 minutes.
donc echo et ls pas du tout identique.


Avatar
Etienne de Tocqueville
"[Sauron De Mordor]" a écrit sur fr.comp.os.unix :

oui sans le l, question d abitude
mais en metant ls -1d on gangne en perf et on afiche sur 1 colonnne


C'est inutile quand la sortie est un pipe...

si is ca marcherais pour le echo, j ai deja utiliser cela sur un alpha
OSF1 avec 2 millions de fichier dans le repertoir.


Ca dépend du shell, donc c'est franchement pas portable !

Avatar
Jérémy JUST
On Fri, 24 Sep 2004 23:21:35 +0200
Etienne de Tocqueville <et+ wrote:

si is ca marcherais pour le echo, j ai deja utiliser cela sur un
alpha OSF1 avec 2 millions de fichier dans le repertoir.
Ca dépend du shell, donc c'est franchement pas portable !



La longueur maximale des lignes de commandes dépend même du noyau!

--
Jérémy JUST


Avatar
Laurent Wacrenier
[Sauron De Mordor] écrit:
la reponse donne est la moins optimale, imagine maintenant au bout de 2 ou 3 ans ce que ca donnera

un bete ls ou echo te donne deja les bonnes info


ls -ld /u/archives/*/ | sort | tail -n 1


CEla fait un double tri.
ls trie déja les fichiers et tu vas le retrier avec sort.

Avatar
Stephane Chazelas
2004-09-25, 01:37(+02), Jérémy JUST:
On Fri, 24 Sep 2004 23:21:35 +0200
Etienne de Tocqueville <et+ wrote:

si is ca marcherais pour le echo, j ai deja utiliser cela sur un
alpha OSF1 avec 2 millions de fichier dans le repertoir.
Ca dépend du shell, donc c'est franchement pas portable !



La longueur maximale des lignes de commandes dépend même du noyau!


Et pas du tout du shell, en fait.

Avec zsh:

setopt extended_glob
print -r [0-9]##([1])

"##" est l'equivalent du "+" des ERE dans le globbin extended de
zsh.
([1]) est un glob qualifier qui dit de retourner seulement la
premiere occurrence (ordre alphabetique par defaut) [-1] pour la
derniere occurrence.

--
Stephane



Avatar
Stephane Chazelas
2004-09-24, 19:56(+02), Etienne de Tocqueville:
Xavier MOGHRABI a écrit sur fr.comp.os.unix :

find /u/archives -maxdepth 1 -regex "/u/common/jarchives/[0-9]+" | sort -r
-n | head -n 1


Pourquoi un find ? Je ne comprends pas trop... Un simple « ls -rd
/u/archives/[0-9]* » me semble plus portable que ton find delamortquitue !


Parce que [0-9]* renvoie les fichiers dont le nom commence par
un chiffre decimal, alors que [0-9]+ renvoie les fichiers dont
le nom est constitué de chiffres. Pour une solution portable
avec find:

find /u/archives/. ! -name . -prune ! -name '*[!0-9]*'
! -name '.*' -print

--
Stephane