web-dev-qa-db-fra.com

Tar Gzip tous les n fichiers dans un répertoire

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?

1
Kohjah Breese

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.

6
muru