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

Archivage récursif

2 réponses
Avatar
Ph. Ivaldi
Bonjour,

Je voudrais créer une archive de tous les fichiers contenus dans tous
les répertoires et sous-répertoires à partir du répertoire courant.
Je procède avec le code suivant:

8<------8<------8<------8<------8<------8<------8<------8<------8<------
#!/bin/sh

for dir in `find ./ -type d ! -name "." -print`; do
(
cd "$dir"
find ./ -maxdepth 1 -type f ! -name "archive.tgz" -print0 |\
xargs -0 tar czf archive.tgz
)
done
8<------8<------8<------8<------8<------8<------8<------8<------8<------

Ça fonctionne bien mais j'obtiens parfois
« tar: Refus catégorique de créer un fichier d'archive vide. »

Où est le problème dans mon code ?
Avez-vous d'autres propositions ?


Une autre question:
Étant donné une archive contenant tous les fichiers d'un répertoire,
comment savoir si un des fichiers du répertoire est plus récent que
celui de l'archive ?

--
Merci de votre attention,
Philippe Ivaldi.
http://piprim.tuxfamily.org/

2 réponses

Avatar
Cyrille Lefevre
Bonjour,

Je voudrais créer une archive de tous les fichiers contenus dans tous
les répertoires et sous-répertoires à partir du répertoire courant.
Je procède avec le code suivant:

8<------8<------8<------8<------8<------8<------8<------8<------8<------
#!/bin/sh

for dir in `find ./ -type d ! -name "." -print`; do
(
cd "$dir"
find ./ -maxdepth 1 -type f ! -name "archive.tgz" -print0 |
xargs -0 tar czf archive.tgz
)
done
8<------8<------8<------8<------8<------8<------8<------8<------8<------

Ça fonctionne bien mais j'obtiens parfois
« tar: Refus catégorique de créer un fichier d'archive vide. »

Où est le problème dans mon code ?
Avez-vous d'autres propositions ?


xargs execute au moins une fois tar cfz archive.tgz meme s'il n'y a pas
de fichiers en entree

PS : la solution tar via xargs est mauvaise, car si plus d'un tar est
execute, l'archive cree ne contiendra que les fichiers de la derniere
execution.

essaye plutot qqc du genre :

# on part du principe qu'il n'y a pas d'n dans les noms de fichier
# mais les espaces sont acceptes
find . -type d ! -name . -print |
while read dir; do
(
# on sort si le cd en marche pas
cd "$dir" || exit
find . -maxdepth 1 -type f ! -name archive.tgz -print |
# pax sait lire une liste des fichiers a archiver sur
# son entree standard au meme titre que cpio
pax -w |
gzip > archive.tgz
)
done

il doit etre possible de remplacer le "cd $dir; find | pax" par
find "$dir" | pax -w -s "|^$dir||" -s "|^/||"

Une autre question:
Étant donné une archive contenant tous les fichiers d'un répertoire,
comment savoir si un des fichiers du répertoire est plus récent que
celui de l'archive ?


find . -newer archive.tgz te renvera la liste des fichiers plus cecent
que archive.tgz

Regards, Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
remove "%nospam" and ".invalid" to answer me.

Avatar
Ph. Ivaldi
Le 09 juillet 2007, Cyrille Lefevre écrivit :

essaye plutot qqc du genre :

# on part du principe qu'il n'y a pas d'n dans les noms de fichier
# mais les espaces sont acceptes
find . -type d ! -name . -print |
while read dir; do
(
# on sort si le cd en marche pas
cd "$dir" || exit
find . -maxdepth 1 -type f ! -name archive.tgz -print |
# pax sait lire une liste des fichiers a archiver sur
# son entree standard au meme titre que cpio
pax -w |
gzip > archive.tgz
)
done


C'est parfait. Je ne connaissais pas "pax".


il doit etre possible de remplacer le "cd $dir; find | pax" par
find "$dir" | pax -w -s "|^$dir||" -s "|^/||"


Là c'est trop compliqué pour moi.


Une autre question:
Étant donné une archive contenant tous les fichiers d'un répertoire,
comment savoir si un des fichiers du répertoire est plus récent que
celui de l'archive ?


find . -newer archive.tgz te renvera la liste des fichiers plus cecent
que archive.tgz


Tout simplement...

Merci.
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/