Ce code awk ne fait pas la même chose...
Il retourne les lignes supérieur à ${aGarder}+1 alors que le but est de retourner les lignes qui se trouvent avant les ${aGarder} dernières lignes.
Version imprimable
Ce code awk ne fait pas la même chose...
Il retourne les lignes supérieur à ${aGarder}+1 alors que le but est de retourner les lignes qui se trouvent avant les ${aGarder} dernières lignes.
c'est normal, puisque ce sont celles qui contiennent le nom des fichiers que Lprofessionnelle veut supprimer.Citation:
Il retourne les lignes supérieur à ${aGarder}+1
pour faire l'inverse, on retourne le chevron, et on ajoute une toute petite condition NR!=1.
ah ? on n'a manifestement pas compris la même chose.Citation:
le but est de retourner les lignes qui se trouvent avant les ${aGarder} dernières lignes.
éventuellement read aGarderCitation:
Envoyé par Lprofessionnelle
or, pour les supprimer, il faut les afficher, pour les passer à rm, ou xargs rm.Citation:
et que suivant le nombre choisit supprimer les fichiers les plus ancien du dossier
Chez moi, 2017-03-15, c'est plus ancien que 2017-04-01 par exemple...
Or tu ramènes bien 2017-04-01 donc tu effacera le mauvais.
Le fichier le plus récent se trouve à la fin de de son fichier et le plus ancien au début, ce qu'il veut c'est garder les n plus récent...
:ptdr:
j'étais parti du principe, sans le vérifier, que les fichiers les plus anciens apparaissaient en derniers.
:cry:
:rire:Code:awk -vtoKeep=10 '1<NR && NR<toKeep+1{print $3}' ./fichierTest
j'en ris encore !
Toujours pas, le but est de garder les 10 derniers et non pas d'éliminer les 10 premiers :)
ah, non, mais quand ça veut pas, ça veut pas ! :traine: :boulet:
donc :eh ben, c'est qu'est-ce que je disais ! :lol:Code:awk -vaGarder=${aGarder} '{line[NR]=$3}END{for(i=2;i<=NR-aGarder;i++){print line[i]}}' fichier
Pour que le shell comprenne qu'il s'agit d'affectation de variable, le signe égal doit être collé au nom de la variable (à gauche) comme au contenu (à droite).
Quand il y a des espaces, ça veut dire: exécute la commande de nom "nom_variable" ("tests" ici), en lui passant comme premier argument la chaîne de caractère "=" et ainsi de suite.
Je voudrais revenir un peu sur les 2 versions suivantes (principalement sur la partie awk) :
Citation:
Code:
1
2
3 head -n -${aGarder} ${FILE} | awk 'NR > 1 && $0=$3' | while read LINE; do echo "Suppression de ${LINE} ... " done
Pour ma part, si je devais choisir une version, je prendrais la première car elle fait un filtre que la deuxième ne fait pas.Citation:
Code:awk -vaGarder=${aGarder} '{line[NR]=$3}END{for(i=2;i<=NR-aGarder;i++){print line[i]}}' fichier
En fait, en awk:
n'est pas la même chose que:Code:awk '$0=$3' fichier
Le deuxieme cas affiche quelque chose dans tous les cas (même une ligne vide si le champs 3 n'existe pas).Code:awk '{print $3}' fichier
Par contre le premier cas n'affiche le champs 3 que s'il existe.
Après, c'est un choix à avoir vis à vis du besoin.
Je vois que mon sujet à fait beaucoup parlé^^.
J'ai juste une dernière question, la première ligne est à ignoré d'ou le tail a -n +2, mais le head tient pas ça en compte, donc comme je veux commencer à la ligne 2 ET en garder 10, je dois mettre 11 en vrai non ? J'avais vu un code avec aGarder+1 c'est pour cette raison ?
Code:head -n -${aGarder} ${FILECam} | tail -n +2 | awk '$0=$3' | while read LINE; do
Code:
1
2
3
4
5
6
7
8
9
10
11
12 > Listing "/path"... DONE [F] 142167030 timelapse_2017-03-20.mp4 [F] 75741770 timelapse_2017-03-21.mp4 [F] 92672190 timelapse_2017-03-22.mp4 [F] 50346505 timelapse_2017-03-23.mp4 [F] 126290279 timelapse_2017-03-24.mp4 [F] 30421780 timelapse_2017-03-25.mp4 [F] 63829615 timelapse_2017-03-27.mp4 [F] 126381439 timelapse_2017-03-29.mp4 [F] 25168973 timelapse_2017-04-01.mp4 [F] 48102651 timelapse_2017-04-05.mp4 [F] 84762581 timelapse_2017-04-07.mp4
Non, pourquoi ?
le head que tu fais est de garder les 10 dernières ligne de ton fichier, ce qui est le cas, ensuite que l'on doit s'occuper de la première ligne du fichier ou pas c'est un autre souci.
Et comme je l'ai déjà dis, en modifiant quelque peut le awk pour qu'il ne tienne pas compte de la première ligne ( awk 'NR>1 && $0=$3' ), tu n'as pas besoin de tail.
Maintenant, ce qui serait franchement amusant de faire, c'est de tout faire en built-in bash ou autre shell :aie::aie:
Une dernière chose cette fois, comment on fait en bash pour extraire la date du fichier ? car la on récupère le nom, mais si en plus dans ma boucle j'ai besoin de la date on peut faire comment ? En PHP c'est très simple, mais la je bloque.
Si tu parles de la date réelle du fichier, il faut utiliser "stat".
Si tu veux extraire la date du nom du fichier, tu peux le faire avec "sed", "cut" ou "awk" ou bien, en pur bash, en t'inspirant de:
Code:
1
2
3
4
5
6
7 $ file=timelapse_2017-04-05.mp4 $ file=${file#*_} $ echo $file 2017-04-05.mp4 $ file=${file%.mp4} $ echo $file 2017-04-05
Je veux bien la date dans le nom du fichier. Ca me donne timelapse_2017-04-05 au lieu de juste 2017-04-05
up, personne pour m'aider ?
Peux-tu nous montrer où en est ton code?
C'est bon j'ai réussi, j'arrivais pas a récupérer la date dans le nom du fichier
Quand tu as réussi, c'est une bonne idée de poster ton code!
C'est une manière pour toi de contribuer à ce forum, car, de cette manière, si d'autres utilisateurs ont un problème similaire, cela peut leur donner des pistes.
D'autre part, si jamais ton code contenait un bug (par exemple, qui n'apparaitrait que dans un cas limite que tu n'as pas encore testé et sur lequel tu ne manqueras pas de tomber, avec un peu de chance...), nous pourrions en le lisant attirer ton attention sur ce point, voire le corriger et t'éviter de t'arracher les cheveux le cas échéant...
Enfin, quand ton problème est résolu, merci de penser à cliquer sur le bouton :resolu: en bas de cette discussion...
Ba le code c'était lui:
J'avais modifié l'exemple et donc ça ne marchait pas. dslCode:
1
2
3
4
5
6
7 $ file=timelapse_2017-04-05.mp4 $ file=${file#*_} $ echo $file 2017-04-05.mp4 $ file=${file%.mp4} $ echo $file 2017-04-05