Un script bash Unix vérifie les files gz vides

J'essaie d'écrire un script bash qui ira dans une boucle de directory à travers les files .gz et les supprimera s'ils sont vides (c'est-à-dire le file non compressé contenu dans empty.

J'ai quelques questions:

  • Y at-il une taille de file standard d'un file compressé (gz) vide que je peux vérifier?
  • Ou est-il un meilleur moyen de vérifier si un file gz contient un file vide sans le décompresser avec un script bash?

J'essayais d'utiliser le code suivant pour atteindre ce but, mais il s'appuie sur la taille du file étant 0 je pense.

for f in dir/* do if [[ -s $f ]] then do_file_creation fi done 

Malheureusement, le file gzip contient le nom de file d'origine, donc sa taille variera sans pour différents files vides.

 gunzip -c $f | head -c1 | wc -c 

écho 1 pour les files non nuls dans la taille non compressée et 0 pour les files vides compressés.

 for f in dir/* do if [[ $(gunzip -c $f | head -c1 | wc -c) == "0" ]] then do_file_creation fi done 

Pourrais-tu faire ce que tu veux?

Vous pouvez append -l à gzip|gunzip|zcat pour imprimer des informations sur le file gzip et tester ensuite la taille du file non compressé.

 $ gunzip -l file.empty.gz compressed uncompressed ratio uncompressed_name 31 0 0.0% file.empty 

Le nom de file (ou l'absence du nom de file dans le file compressé) changera la taille des files afin que vous ne puissiez pas searchr une taille standard, par exemple

 $ touch file1 file2-longer-name file3 $ gzip file1 file2-longer-name $ gzip --no-name file3 $ ls -l file*.gz -rw-r--r-- 1 cwarden cwarden 26 May 29 10:33 file1.gz -rw-r--r-- 1 cwarden cwarden 38 May 29 10:33 file2-longer-name.gz -rw-r--r-- 1 cwarden cwarden 20 May 29 10:33 file3.gz 

Je ferais probablement quelque chose comme ça:

 for f in dir/*; do zcat $f | head -1 | ifne -n rm -f $f > /dev/null done 

Il y a probablement une meilleure façon mais cela devrait vous donner la taille du file de la version non compressée du file compressé:

export fsize=$(gunzip -l ${f} | tail -1 | awk -F " " '{print $2}' )

 for i in *.gz do [ `zcat "$i" | head -n 1 | wc -c ` -eq 0 ] && rm -i "$i" done 

Le zcat "$i" | head -n 1 | wc -c zcat "$i" | head -n 1 | wc -c zcat "$i" | head -n 1 | wc -c countra le nombre de caractères de la première ligne du file, ce qui évite de décompresser l'set du file en regardant simplement le début.

J'ai aussi ajouté un -i à la command rm pour requestr une confirmation avant de supprimer le file, mais vous pouvez le supprimer si cela n'est pas nécessaire dans votre cas.