J'ai un dossier contenant 7 491 fichiers. Je voudrais tar gzip ces par lots de 100, par exemple.
first 100 files > archive1.tar.gz
files 101-200 > archive2.tar.gz
files 201-300 > archive3.tar.gz
Existe-t-il un moyen de le faire via la ligne de commande?
L'option la plus simple pourrait être d'utiliser la commande split
en combinaison avec find
et tar
's -T
/--files-from
option:
find ... -type f -print0 |
split -t '\0' -l 100 -d --filter 'tar czf archive-$FILE.tar.gz --files-from=- --null'
split
se chargera également de définir les noms de fichiers avec une numérotation séquentielle (le -d
option définit des noms de fichiers numérotés au lieu des noms alphabétiques habituels).
Avec une combinaison de find
et xargs
, je ne pouvais pas trouver un moyen d'obtenir une numérotation séquentielle fiable des archives, j'ai donc utilisé uuidgen
:
find <directory> -type f -print0 | xargs -n 100 -0 sh -c 'tar -czf archive-$(uuidgen).tar.gz "$@"' _
Ou vous pouvez utiliser des boucles bash:
count=1
N=100
find <directory> -type f -print0 |
{
while true
do
files=()
for ((i=0;i<N;i++)) # Add N filenames to the `files` array
do
IFS= read -d '' -r file
files+=("$file")
done
((count++))
tar -czf archive-$count.tar.gz "${files[@]}"
done
}
Une hypothèse dans toutes ces commandes est que find
n'est pas exécuté dans le répertoire courant. Sinon, vous pourriez finir par goudronner un fichier tar. Si vous devez l'exécuter dans le répertoire courant, je suggère d'enregistrer les noms de fichiers dans un fichier, puis de lire les noms de fichiers de ce fichier pour split
/xargs
/la boucle.