Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/03/2019, à 21:20

Oliv59

Recherche d'un fichier au milieu d'une liste [LS - SED... ] ?

Hello ici,

J'ai actuellement une ligne de commande qui me retourne le dernier fichier jpeg d'un dossier, triés par date :
ls -tr1 $EVENTSPATH/*.jpg | tail -1 | sed 's#.*/##'

Je cherche l'équivalent, mais qui me retournerait plutôt le fichier au milieu (celui entre le premier et le dernier), sachant que je ne connais pas ne nombre de fichiers. Ça peut se faire facilement, ça ?
Au pire, c'est dans un script bash, donc s'il faut faire un peu de manips avant / apres, ca peut aussi répondre au besoin cool
Merci, bisous wink

Oliv.

Dernière modification par Oliv59 (Le 06/03/2019, à 21:21)

Hors ligne

#2 Le 06/03/2019, à 21:40

Watael

Re : Recherche d'un fichier au milieu d'une liste [LS - SED... ] ?

salut,

il ne faut pas espérer la moindre robustesse d'une ligne de commande qui parse la sortie de ls.
les noms de fichiers peuvent contenir des caractères qui feraient échouer les commandes suivantes, ou donneraient une sortie finale erronée.

voici une version immédiate peut-être un peu plus compliquée, en bash :

~ $ while IFS='|' read -d '' time name; do fileList+=( "$name" ); done < <(find -maxdepth 1 -type f -printf '%Ts|%p\0' | sort -z -t '|' -k1,1 )
~ $ echo "${fileList[${#fileList[*]}/2]}"

à noter que les noms des variables utilisateurs doivent ne pas être tout en majuscules pour ne pas risquer d'écraser les variables d'environnement qui, elles, par convention, sont tout en majuscules (HOME, PATH...).

Dernière modification par Watael (Le 06/03/2019, à 21:42)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 06/03/2019, à 21:49

Oliv59

Re : Recherche d'un fichier au milieu d'une liste [LS - SED... ] ?

Hello Watael,
Merci pour ta réponse rapide. Ton commentaire sur les majuscules, c'est pour ma variable EVENTPATH, c'est ca ?
D'ailleurs, dans ton script (qui m'est, je dois bien l'avouer, à 90% illisible mais je te fais confiance), je place ou ma variable eventpath et mon filtre sur les jpg ?
Encore merci pour ton aide wink
Oliv.

Hors ligne

#4 Le 06/03/2019, à 22:00

Watael

Re : Recherche d'un fichier au milieu d'une liste [LS - SED... ] ?

oops. j'ai oublié de les mettre. grrr.

while IFS='|' read -d '' time name; do fileList+=( "$name" ); done < <(find "$eventsPath" -maxdepth 1 -type f -name '*.jpg'-printf '%Ts|%p\0' | sort -z -t '|' -k1,1 )

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 06/03/2019, à 22:01

melixgaro

Re : Recherche d'un fichier au milieu d'une liste [LS - SED... ] ?

Salut,

Si la variable contient le dossier où se fait la recherche, tu peux la placer après le find comme ceci :

find "${eventspath}" -maxdepth 1 ETC

Modif. : devancé par Watael

Dernière modification par melixgaro (Le 06/03/2019, à 22:01)


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#6 Le 06/03/2019, à 22:13

Oliv59

Re : Recherche d'un fichier au milieu d'une liste [LS - SED... ] ?

Ah, j'avais  une autre solution, plus accessible pour moi :

while IFS='|' read -d '' time name; do fileList+=( "$name" ); done < <(find $EVENTSPATH/*-capture.jpg -maxdepth 1 -type f -printf '%Ts|%p\0' | sort -z -t '|' -k1,1 )
LATESTIMG=$(basename "${fileList[${#fileList[*]}/2]}")

Ca marche aussi, ou pas ?
Le "*-capture.jpg" est un autre filtre dont j'ai finalement besoin aussi, c'est pour ca qu'il apparait maintenant. Mais sinon, ma methode vous semble bonne aussi ? Ah, et le basename, c'est parce que vos commandes retournent un path complet, et j'ai besoin seulement du nom du fichier. Si vous avez une maniere plus propre, n'hesitez pas wink
En tous cas, un grand merci pour votre aide big_smile

Dernière modification par Oliv59 (Le 06/03/2019, à 22:13)

Hors ligne

#7 Le 06/03/2019, à 22:16

melixgaro

Re : Recherche d'un fichier au milieu d'une liste [LS - SED... ] ?

Non, dans ce cas tu ajoutes le filtre sur le nom de fichier avec l'option -name de la commande find

-name "*-capture.jpg"

que tu places après '-type f'

(option -iname pour être insensible à la casse).


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#8 Le 06/03/2019, à 22:23

Watael

Re : Recherche d'un fichier au milieu d'une liste [LS - SED... ] ?

et si Oliv se demande pourquoi dans un cas il y a des accolades et pas dans l'autre, c'est parce que dans un cas c'est inutile, et dans l'autre, je ne les mets pas. lol


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 06/03/2019, à 22:25

Oliv59

Re : Recherche d'un fichier au milieu d'une liste [LS - SED... ] ?

Top !
Ca marche nickel, un grand merci encore, réponse rapide et précise big_smile
Bonne soirée à tous wink

Hors ligne

#10 Le 06/03/2019, à 22:27

melixgaro

Re : Recherche d'un fichier au milieu d'une liste [LS - SED... ] ?

HS : Ah, je les (les accolades) mets systémtatiquement autour de mes variables bash (tout comme les guillemets droits, sauf cas rares)… C'est inutile, certes, mais les variables ont toujours la même syntaxe dans mes scripts.


Linux depuis ~2007. Xubuntu seulement.

Hors ligne