Je voudrais créer un fichier gzippé qui conserve le nom du fichier d'origine. Par exemple, gzipping "example.txt" devrait générer un fichier gzippé nommé "example.txt" plutôt que "example.txt.gz". Est-il possible de le faire avec élégance avec une seule commande (sans faire de commande ultérieure mv
)?
14
Réponses:
Cela ne fonctionne pas:
Il s'agit d'une condition de concurrence:
Le problème est que le
> example.txt
(oudd of=example.txt
d'ailleurs) tue le fichier avant que l'autre processus ait la chance de le lire. Il n'y a donc pas de solution évidente, c'est pourquoi vous devez vous y tenirmv
.Il existe plusieurs façons de tricher. Vous pouvez ouvrir le fichier, puis le dissocier - le fichier continuera d'exister jusqu'à ce que vous le fermiez - puis créer un nouveau fichier avec le même nom et y écrire les données compressées. Cependant, je ne connais pas de moyen évident de contraindre bash à l'utiliser, et même si je le faisais, ma réponse serait toujours:
Ne le fais même pas.
Si
gzip
échoue pour une raison quelconque ou si un problème survient, comme si vous manquez d'espace pendant le gzipping (parce que d'autres processus sont en train d'écrire ou si le résultat de gzip est plus grand que l'entrée - ce qui se produit pour les données aléatoires - etc.), vous venez de perdre votre fichier . Toutes nos félicitations!Créez un fichier séparé et
mv
en cas de succès. C'est la méthode la plus simple, facile à comprendre et la plus fiable que vous trouverez jamais.la source
gzip example.txt && mv example.txt.gz example.txt
mv
en cas de succès." peut être rendu plus élégant? J'essayais simplement de proposer que la réponse de frostschutz soit complétée par un exemple spécifique. Si vousmv
pouvez l'utiliser plus élégamment que je ne le pensais, veuillez donner un exemple.J'ai eu le même problème, dans le cadre d'un déploiement CI sur AWS S3.
Voici ce que j'ai fait pour compresser récursivement un répertoire (en place) sans le
.gz
suffixe:Semble assez propre pour moi. Mais oui, on dirait que vous en avez besoin
mv
quelque part.Si vous utilisez,
grunt
vous pouvez regardergrunt-contrib-compress
. Certains desgrunt
outils spécifiquement destinés au déploiement sur S3 géreront également gzip pour vous.la source
find . -type ...
pasfind.
ajouter l'espace s'il vous plaît :)-S
extension que vous voulezrésultera en dog.txt_2015_11
lorsque vous le décompressez, vous devez spécifier l'extension.
Sous Unix, utilisez la commande file pour déterminer le type de fichier dont vous disposez, les extensions sont trompeuses ou manquent souvent.
la source
Je ne pense pas que la création d'un fichier gzip sans extension soit vraiment la bonne chose à faire.
IMHo vous devez configurer votre serveur web pour lire le fichier .gz. Vous avez probablement déjà une règle comme celle-ci:
Vous avez juste besoin d'ajouter une règle réécrivant le nom de fichier demandé pour ajouter ".gz" (en fait, vous devez vérifier que le fichier existe, tout comme vous devriez vérifier que le client a bien répertorié gzip sur son en-tête Accept-Encoding)
la source
Vous pouvez essayer s3_website pour cela.
Je n'aime pas le fait qu'il soit écrit en scala et en rubis et qu'il nécessite une machine virtuelle Java. De plus, je n'aime pas l'hypothèse qu'il fait (en particulier le fait qu'il supprime des fichiers supplémentaires du compartiment), mais cela devrait fonctionner si cela vous convient.
Je prévois d'écrire un tel outil par moi-même qui n'a pas ces limitations, restez à l'écoute.
la source
Ce n'est pas vraiment quelque chose que vous devriez faire, principalement parce que lors du transfert de ce fichier vers d'autres systèmes ou personnes, cela pourrait être source de confusion pour eux et ne pas le trouver en tant que fichier compressé.
Si vous ne voulez pas utiliser de suffixe, alors GNU n'est pas bon pour vous, comme
gzip -S ""
retournerait agzip: invalid suffix ''
.Cependant, vous pouvez toujours envoyer quelque chose comme
gzip -S " "
(espace vide), et il sera affiché comme ceci:Ensuite, si vous voulez le décompresser, vous devrez faire quelque chose comme
gunzip -c testfile\
(sans spécifier le suffixe), ou même avec-f
flag.Je pense sincèrement que l'ajout d'une
mv
commande avec&&
ne compliquerait pas beaucoup votre code. Quoi qu'il en soit, et comme l'a dit @frostschutz, ce n'est pas vraiment une bonne idée de le faire.la source