Tengo un directorio con demasiados archivos.
Quiero comprimir los primeros 5 mil archivos en ese directorio para convertirlos en file.tar.gz
5001 - 10000... y así sucesivamente.
¿cómo hacerlo?
Respuesta1
Utilice ls para generar la lista de nombres y head y tail para filtrarlos. Aquí hay una frase que lo hace en un bucle. Necesitará saber la cantidad de archivos en el directorio (ls | wc -l se lo dirá).
for ii in $(seq -w 5000 5000 NUMBER_OF_FILES) ; do echo $ii ; ls | head -n $ii | tail -n 5000 | tar -f ../ARCHIVE_FILE_$ii.tar.gz -czv -T - ; done
Reemplaza los bits en mayúsculas con lo que quieras.
Respuesta2
Este script agrega gradualmente todos los archivos al archivo y lo numera. Cambie el nombre de ARCHIVE_NAME y '5000'.
$ COUNT_MOD=0; for i in *; do tar -r -f ARCHIVE_NAME`expr $COUNT_MOD / 5000`.tar $i; ((COUNT_MOD++)) ; done
Este script no está optimizado, por lo que existen algunas reglas:
- ARCHIVE_NAME# no debe existir al iniciar este script, por lo que si algo falla, realice un 'rm ARCHIVE_NAME*'.
- El script trata una entrada de directorio como 1 entrada, pero no como "tar". Tar irá al directorio y agregará todos los archivos de forma recursiva, y es posible que termine con más de 5000 archivos en un archivo.
- Los archivos comprimidos no se pueden actualizar, omití '-z', lo siento :-)
Respuesta3
Puede crear un conjunto de archivos que enumeren cada uno de ellos 5000 nombres de archivo y usarlos con los argumentos -T para tar. Algo como esto podría funcionar:
ls -1 | split -l 5000 - tarlist
count=0
for f in tarlist*
do
tar -czf save.$count.tar.gz -T $f
count=`expr $count + 1`
done