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 14/03/2014, à 16:46

malcolm35

[RESOLU] [script/bash] script permettant de supprimer des fichiers

Bonjour,

je voudrais réaliser un script permettant de supprimer certains fichiers.
en gros je voudrais d'abord extraire les fichiers dont les 6 premiers caractères du nom sont identiques

exemple :

client-mint test_# find 700***
700256a01.mpg
700256a02.mpg
700256a03.mpg
700269a01.mpg
700288a01.mpg
700313a01.mpg
700313a02.mpg
700333a01.mpg
700333a02.mpg
700342a01.mpg
700343a01.mpg
700345a01.mpg

dans cette liste il y'a plusieurs fichiers dont les 6 premiers caractères sont identiques comme les fichiers 700256a01.mpg, 700256a02.mpg et 700256a03.mpg

cette commande me permet de le vérifier

lient-mint test_paga # find 700*** | cut -c '1-6' | uniq -D
700256
700256
700256
700313
700313
700333
700333

mais elle ne m'affiche que des caractères (les 6 premiers) et non les noms entiers de fichiers, je ne peux donc pas agir dessus/

Ensuite, je voudrais pouvoir comparer ces fichiers "doublons" et si l'un d'entre eux à une date de modification antérieure à 2 mois par rapport au plus récent, le supprimer.
Ce n'est pas évident à expliquer.

Merci de votre aide si vous avez compris !

Cordialement

Dernière modification par malcolm35 (Le 28/03/2014, à 10:29)

Hors ligne

#2 Le 14/03/2014, à 18:47

pingouinux

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

Bonjour,
Pour avoir la liste des fichiers "doublons" :

for fic in 700*
do
   rac=${fic:0:6}
   ((n[rac]++))
done 

for r in "${!n[@]}"
do
   ((n[r]>1)) && { echo; ls -1 "$r"*; }
done 

dont voici le résultat :

700256a01.mpg
700256a02.mpg
700256a03.mpg

700313a01.mpg
700313a02.mpg

700333a01.mpg
700333a02.mpg

Ajouté :

Pour faire les suppressions (date de modif de plus de 60 jours par rapport au plus récent) :

for fic in 700*
do
   rac=${fic:0:6}
   printf "%s %s\n" "$rac" "$(stat -c "%Y %n" "$fic")"
done | sort -r | while read rac dat fic
do
   if [ "$rac" = "$rac_av" ]; then
      t1=$dat
      (( (t0-t1)>60*86400 )) && echo rm "$fic"
   else
      t0=$dat
      rac_av="$rac"
   fi
done

et supprimer le echo devant rm si c'est correct.

Édité : Simplification

Dernière modification par pingouinux (Le 15/03/2014, à 05:03)

Hors ligne

#3 Le 15/03/2014, à 21:25

malcolm35

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

Bonjour,

Merci beaucoup pour vos conseils.
Je vais tester dès que possible et vous redire si ça fonctionne.

smile

Hors ligne

#4 Le 25/03/2014, à 10:53

malcolm35

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

@pinguinux :


Bonjour,

J'ai des erreurs sur les scripts que vous m'avez indiqués :

Pour le premier script de recherche :

!/bin/bash

for fic in 700*
do
        rac={$fic:0:6}       <= J'AI SUPPOSE ICI QU'IL Y'AVAIT UNE ERREUR DE PLACEMENT DE "$"
        ((n[rac]++))
done

for r in "${!n[@]}"
do
        ((n[r]>1)) && { echo; ls -l "$r"*; }
done

me retourne :

client-mint test_paga # sh script.sh 
script.sh: 6: script.sh: n[rac]++: not found
script.sh: 6: script.sh: n[rac]++: not found
script.sh: 6: script.sh: n[rac]++: not found
script.sh: 6: script.sh: n[rac]++: not found
script.sh: 6: script.sh: n[rac]++: not found
script.sh: 6: script.sh: n[rac]++: not found
script.sh: 6: script.sh: n[rac]++: not found
script.sh: 6: script.sh: n[rac]++: not found
script.sh: 6: script.sh: n[rac]++: not found
script.sh: 6: script.sh: n[rac]++: not found
script.sh: 6: script.sh: n[rac]++: not found
script.sh: 6: script.sh: n[rac]++: not found
script.sh: 9: script.sh: Bad substitution

Pour le script qui permet aussi de faire les suppressions :

#!/bin/bash

for fic in 700*
do
   rac={$fic:0:6}
   printf "%s %s\n" "$rac" "$(stat -c "%Y %n" "$fic")"
done | sort -r | while read rac dat fic
do
   if [ "$rac" = "$rac_av" ]; then
      t1=$dat
      (( (t0-t1)>60*86400 )) && echo rm "$fic"
   else
      t0=$dat
      rac_av="$rac"
   fi
done

ne me retourne aucuns résultats :

client-mint test_paga # sh script2.sh 
client-mint test_paga # 

Merci de votre aide ! smile

Dernière modification par malcolm35 (Le 25/03/2014, à 10:55)

Hors ligne

#5 Le 25/03/2014, à 11:02

pingouinux

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

Ce sont des scripts bash (j'aurais dû le préciser). Il faut les lancer ainsi :

bash nom_du_script

Dans mes scripts en #2, le "$" était placé correctement.

Hors ligne

#6 Le 25/03/2014, à 11:50

malcolm35

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

au temps pour moi !

j'essayai de lancer sh mon_script qui fonctionne sous Debian, mais pas sous Mint a priori.

Effectivement le premier script fonctionne bien smile

En revanche je voudrai obtenir la liste de tous les fichiers ayant les 6 premiers caracteres en commun et pas uniquement ceux commençant par 700

j'ai remplacé

for fic in 700*

par

for fic in *

mais cela retourne une erreur , est-ce normal ?

Cordialement,

Hors ligne

#7 Le 25/03/2014, à 12:09

pingouinux

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

mais cela retourne une erreur , est-ce normal ?

Non. Peux-tu montrer le script complet, la façon dont tu le lances, et le message d'erreur ?

Hors ligne

#8 Le 25/03/2014, à 12:14

malcolm35

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

voici l'erreur

client-mint test_paga # bash script.sh 
script.sh: ligne 6: 10111. : erreur de syntaxe : opérateur arithmétique non valable (le symbole erroné est ".")

Rajout : Script complet

#!/bin/bash

for fic in *
do
   rac=${fic:0:6}
   ((n[rac]++))
done 

for r in "${!n[@]}"
do
   ((n[r]>1)) && { echo; ls -1 "$r"*; }
done 

Dernière modification par malcolm35 (Le 25/03/2014, à 12:21)

Hors ligne

#9 Le 25/03/2014, à 12:49

pingouinux

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

C'est sans doute parce que le nom d'un des fichiers  comporte autre chose que des chiffres dans les 6 premiers caractères. Si c'est le cas, il faudra faire autrement.

Ajouté : À tester

#!/bin/bash

declare -A n
for fic in *
do
   rac=${fic:0:6}
   ((n[$rac]++))
done 

for r in "${!n[@]}"
do
   ((n[$r]>1)) && { echo; ls -1 "$r"*; }
done 

Dernière modification par pingouinux (Le 25/03/2014, à 13:07)

Hors ligne

#10 Le 25/03/2014, à 15:32

malcolm35

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

Cela semble fonctionner !

Pour faire une recherche multiple, par exemple

for fic in 5* et for fic in 7* mais en une seule commande ?

Merci

Hors ligne

#11 Le 25/03/2014, à 15:58

Sciensous

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

for i in 5* 7*

antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )

Hors ligne

#12 Le 25/03/2014, à 17:25

malcolm35

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

Merci pour votre aide car votre script fonctionne parfaitement.

Je suis désolé de rajouter une condition mais je n'ai pas pris en compte une option.

En réalité je dois bien isoler les 6 premiers caractères mais également prendre en compte les deux lettres qui se situent à la suite

exemple :

529047aa01.mpg
529047ab01.mpg
529047ac01.mpg

Ici "ac" existe donc on suppose que aa et ab sont plus anciens. S'ils sont plus anciens de 2 mois il faut les supprimer. Cependant on pourra trouver certaines fois :

5625412ac01
5625412ad01

dans ce cas il faudra conserver celui avec "ad" car il est le plus récent (la lettre d le prouve) et si le "ac" est plus ancien de deux mois il faut supprimer le AC.
Ce n'est pas évident car il faut prendre en compte l'ordre de l'alphabet, et là ça me parait très compliqué.

Mais vous en avez déjà fait beaucoup, cependant si vous avez une idée....

Cordialement

Et merci déjà pour l'aide que vous m'avez apporté.

Dernière modification par malcolm35 (Le 28/03/2014, à 10:38)

Hors ligne

#13 Le 25/03/2014, à 17:38

pingouinux

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

Est-ce qu'un fichier apparaissant après dans l'ordre alphabétique est obligatoirement plus récent ?
Les deux lettres à prendre en compte peuvent-elles se situer n'importe où après le 6ème caractère ?

Hors ligne

#14 Le 25/03/2014, à 17:42

malcolm35

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

Logiquement, on part du principe que le fichier apparaissant après dans l'ordre alphabétique est forcément le plus récent.

ainsi si on a ab, ac, ad => ad sera le plus récent. Le script se base -t-il sur la date de création ou de modification ?
Les deux lettres à prendre en compte se situent systématiquement derrière les 6 chiffres et sont systématiquement a* (aa, ab, ac, ad, etc..) elle peuvent être eventuellement AA AB AC (j'aimerai ne pas tenir compte de la casse)

ce n'est pas simple !

Hors ligne

#15 Le 25/03/2014, à 17:56

pingouinux

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

Le script se base -t-il sur la date de création ou de modification ?

Mon script en #2 se base sur la date de modification, mais ça peut se changer facilement.

As-tu un exemple de fichiers (noms et dates) pour lesquels le script ne fonctionne pas ?

Dernière modification par pingouinux (Le 25/03/2014, à 18:05)

Hors ligne

#16 Le 25/03/2014, à 18:34

malcolm35

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

Je t'envoie ça demain car je n'ai plus accès a la machine à cette heure-ci. Le problème si on ne se base pas sur l'indice aa, ab est que si le fichier aa a été modifié récemment il ne sera plus reconnu comme plus ancien. En fait peut-être que si on se base sur les 6 chiffres + la date de création on est sur que l'ordre sera respecté ?
Ce qui se passait avec ton script en #2 c'est qu'il me sortait un fichier avec un indice ad et gardait ce même fichier en ac. Je sais que ça n'est pas évident a visualiser le problème étant que l'organisation du répertoire n'a pas été très bien faite.
Je pense que la date de création pourrait etre la solution car a la création l'utilisateur a forcément écrit un "ab" s'il y'avait un "aa" existant.

Hors ligne

#17 Le 25/03/2014, à 21:02

melixgaro

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

coucou,

à pingouinux
Je suis scotché par la simplicité et la compacité de ton code bash.
En fait, quand tu postes du code, c'est bien souvent un bijou de concision. Je profite de ce fil pour te féliciter et te dire mon admiration.
Je suis loin d'avoir ton niveau...

à +


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#18 Le 25/03/2014, à 21:09

malcolm35

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

@melixgaro @pinguinux
Je suis également assez impressionné par ses scripts et notamment la rapidité à laquelle il répond à des problématiques assez difficiles ne serait-ce qu'à expliquer par écrit !

Hors ligne

#19 Le 25/03/2014, à 21:24

pingouinux

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

@melixgaro : Ce n'est que la conséquence de très nombreuses années de pratique. J'ai aussi énormément appris sur ce forum, en aidant quand je le pouvais, et surtout en lisant les réponses des autres.

Hors ligne

#20 Le 26/03/2014, à 10:22

malcolm35

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

Bonjour,

en réalité en regardant les résultats du script, il supprime les bons fichiers. Il semble qu'il ne soit pas nécessaire de se baser sur l'indice aa, ab, ....
en revanche comment puis-je adapter le script pour qu'il se base sur la date de création du fichier et non de dernière modification ?

Merci à toi.

Hors ligne

#21 Le 26/03/2014, à 10:28

malcolm35

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

je connais la commande

find -ctime

mais tu n'utilise pas de "find" dans ton script neutral

Hors ligne

#22 Le 26/03/2014, à 12:33

pingouinux

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

comment puis-je adapter le script pour qu'il se base sur la date de création du fichier et non de dernière modification ?

Remplacer

   printf "%s %s\n" "$rac" "$(stat -c "%Y %n" "$fic")"

par

   printf "%s %s\n" "$rac" "$(stat -c "%W %n" "$fic")"

(%Y -> %W, voir man stat)

Hors ligne

#23 Le 26/03/2014, à 17:07

malcolm35

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

en utilisant la varialble %W je n'ai plus de résultat

%W     date de création en secondes depuis le temps zéro de l'ordinateur, ou 0 si elle n'est pas connue

J'imagine que c'est car la date de création n'est pas connue par le système.

C'est pour cela qu'utiliser les indices AA, AB, AC etait pratique dans le sens ou on est sur que AC à été créé après AB et ainsi de suite.
Le problème en utilisant la dernière date de modif, est que si quelqu'un à touché au fichier AA, il apparaitra comme plus récent que le AC.

Penses-tu que le fait que le système semble ne pas connaitre la date de création vient du fait que les fichiers ont été créés sous Windows ?
(en réalité je monte un partage Windows sur mon serveur Debian et j'éxécute mon script depuis celui-ci)

Merci

Hors ligne

#24 Le 26/03/2014, à 17:29

pingouinux

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

Je me suis trompé, et n'aurais pas dû me fier au man stat sans faire le test.

stat -c "%W" fichier_linux

me renvoie 0 aussi. Il va falloir trouver autre chose.

Hors ligne

#25 Le 26/03/2014, à 17:43

malcolm35

Re : [RESOLU] [script/bash] script permettant de supprimer des fichiers

Penses-tu, sinon, qu'il soit difficile de rajouter le facteur de l'indice ?
Ex : je sais que tous mes fichiers sont composés de 6 chiffres + a* derrière. Comme 501222aa01, 501222ab01,501222ac01. On pourrai cette fois isoler les 7 premiers caractères de cette façon :

For fic in ******a

Et ensuite comparé la lettre suivante tout en sachant que la lettre la plus loin dans l'alphabet correspond au fichier le plus récent.

Je pense que c'est chaud. Si pas possible je resterai sur la dernière date de modif mais cela comporte un petit risque de supprimer des mauvais fichiers..

Hors ligne