Exercice commandes du shell

Fermé
Durindal - 24 déc. 2009 à 09:29
 Durindal - 24 déc. 2009 à 18:17
Bonjour tout le monde,

Je suis bloqué depuis maintenant plusieurs jours sur un exercice sur les commandes du shell (oui, j'ai envie de me pendre :) )

Voici l'exercice :

Vous souhaitez compresser automatiquement tous les répertoires qui ne contiennent pas au moins un fichier utilisé dans le dernier mois.

Voici le programme que j'ai concocté en shell et avec awk aussi (qui bien sûr, ne fonctionne pas) :

find -type f -atime -30 > data1.txt Je met dans data1.txt tous les fichiers qui ont été utilisé dans le dernier mois
cat data1.txt | awk -v x="test" -v y="test" 'BEGIN {FS = "/"} {for(j=NF-1;j>=1;j=j-1){y=$1;for (i=2;i<=j;i=i+1){x=$i;y='y' "/" 'x'} ; print y}}' > data2.txt Cette commande compliquée me permet tout simplement de retirer les fichiers pour mettre dans data2.txt seulement les répertoires
find -type f > data3.txt
cat data3.txt | awk -v x="test" -v y="test" 'BEGIN {FS = "/"} {for(j=NF-1;j>=1;j=j-1){y=$1;for (i=2;i<=j;i=i+1){x=$i;y='y' "/" 'x'} ; print y}}' > data4.txt Je fais la même chose avec tous les fichiers, en ne prenant que leur répertoires
sort data2.txt data2.txt data4.txt | uniq -u > data5.txt Je retire les dossiers de data2.txt à data4.txt, pour ne finalement garder que les dossiers contenant des répertoires qui contiennent aucun fichier utilisé dans le mois dernier.
for line in $(cat data5.txt); do tar cvzf $line.tgz $line; done Enfin, je compresse les répertoires restants.

La dernière commande fonctionne bien, mais le programme ne marche pas, donc ça doit venir des opérations que je fais pour ne garder que les répertoires que je dois compresser dans data5.txt.

Qqun a des idées ?

Merci d'avance pour les réponses.

4 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
24 déc. 2009 à 11:11
Salut,

Et un truc comme ça :

[tmpfs]$ ls TEST/ -1
Archives/
bin/
Moderation/
new_rep/
testeur/
Work/

[tmpfs]$ find TEST/ -type f -mtime +30 -exec dirname {} \; | sort -u > data.txt     # On récupère à l'aide de la commande "dirname" la liste des répertoires contenant un ou des fichiers modifiés dans les 30 derniers jours

[tmpfs]$ cat data.txt     # Liste des répertoires à exclure
TEST/bin
TEST/Moderation
TEST/new_rep

[tmpfs]$ tar cvzf archive.tar.gz -X data.txt TEST
TEST/
TEST/testeur/
TEST/testeur/fileC
TEST/testeur/fileB
TEST/testeur/fileA
TEST/Archives/
TEST/Work/

[tmpfs]$ tar -tf archive.tar.gz
TEST/
TEST/testeur/
TEST/testeur/fileC
TEST/testeur/fileB
TEST/testeur/fileA
TEST/Archives/
TEST/Work/
[tmpfs]$ 

;-))
0
Bonjour,

Déjà, un grand merci pour ta réponse.

Tu peux m'expliciter les deux dernières instructions ?

Et voici un exemple pour préciser le but de l'exercice :

Supposons que vous exécutez la commande à partir du répertoire courant :

./file1
./dirA
./dirA/dirC
./dirA/dirC/file4
./dirA/dirC/file5
./dirA/dirC/dirD
./dirA/dirC/dirD/file8
./dirA/dirC/dirD/file6
./dirA/dirC/dirD/file7
./dirA/dirE
./dirA/dirE/file9
./dirA/file2
./dirA/file3
./dirB
./dirB/file10
./dirB/dirF
./dirB/dirF/file11
./dirB/dirF/file12
./dirB/dirF/dirG
./dirB/dirF/dirG/file13

Où les seuls fichiers qui ont été consultée au cours du mois passé sont file10 et file6. Après que votre commande est exécutée, le répertoire doit ressembler à ceci :

./file1
./dirA
./dirA/dirC
./dirA/dirC/file4
./dirA/dirC/file5
./dirA/dirC/dirD
./dirA/dirC/dirD/file8
./dirA/dirC/dirD/file6
./dirA/dirC/dirD/file7
./dirA/dirE.tgz
./dirA/file2
./dirA/file3
./dirB
./dirB/file10
./dirB/dirF.tgz

Voilà, donc il ne faut pas seulement regarder les répertoires dans le répertoire courant, mais tout ceux en dessous. Assez compliqué :x
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
24 déc. 2009 à 14:03
il ne faut pas seulement regarder les répertoires dans le répertoire courant, mais tout ceux en dessous.
C'est ce que fait la commande "find" par défaut y compris dans la solution que je t'ai donnée !

Si tu appliques les commandes données plus haut sur ton exemple, ça devrait le faire...

Tu peux m'expliciter les deux dernières instructions ?
Dans la commande tar, le "-X data.txt" demande d'exclure de l'archivage les dossiers/fichiers présents dans le listing de "data.txt".

Quant à la 2nd, c'est juste un test pour lister le contenu de l'archive "paramètre -t de la commande tar", afin de s'assurer (en plus de la verbosité de la commande précédente "-v") que lesdits fichiers on bien été exclus.
0
Je comprends mieux.

Néanmoins ça ne marche toujours pas.

Déjà pour ne pas archiver les répertoires contenant des fichiers utilisés dans le dernier mois, il faut utiliser l'option -atime -30.

De plus, quand tu utilises find /TEST, si j'ai bien compris, ça ne va chercher que les fichiers dans ce répertoire.
Quand tu met TEST dans la commande pour compresser, ça ne va pas compresser que les dossiers du répertoire TEST et pas plus loin ? Comment faire pour sélectionner le répertoire courant par défaut ?

Merci pour ta réponse.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
24 déc. 2009 à 16:12
Déjà pour ne pas archiver les répertoires contenant des fichiers utilisés dans le dernier mois, il faut utiliser l'option -atime -30.
Non, là c'est les fichiers accèdés depuis moins de 30 jours.
Avec -mtime +30, on recherche les fichiers modifiés depuis il y a plus de 30 jours.


De plus, quand tu utilises find /TEST, si j'ai bien compris, ça ne va chercher que les fichiers dans ce répertoire.
Non, comme je t'ai dit le comportement par défaut de "find" c'est de descendre dans les répertoires récursivement. Pour ne pas qu'il y descende (ou pour lui spécifier un niveau, il faut implicitement le lui dire avec "-maxdepth".

Quand tu met TEST dans la commande pour compresser, ça ne va pas compresser que les dossiers du répertoire TEST et pas plus loin ?
Non, ça descend dans l'arborescence.

Comment faire pour sélectionner le répertoire courant par défaut ?
Soit tu mets un "." (point) soit tu mets rien :

find . -type f -name blabla
find  -type f -name blabla

0
Merci beaucoup pour ton aide :)
0