web-dev-qa-db-fra.com

la commande zip ne fonctionne pas

J'essaie de compresser un fichier à l'aide de la commande de script Shell. J'utilise la commande suivante:

  Zip ./test/step1.Zip $FILES

où $ FILES contient tous les fichiers d'entrée. Mais je reçois un avertissement comme suit

    Zip warning: name not matched: myfile.dat

et encore une chose, j'ai observé que le fichier qui est enfin dans la liste des fichiers dans un dossier a l'avertissement ci-dessus et que ce fichier n'est pas compressé.

Quelqu'un peut-il m'expliquer pourquoi cela se produit? Je suis nouveau dans le monde des scripts Shell.

15
Aparna Savant

Avertissement de fermeture éclair: le nom ne correspond pas: monfichier.dat

Cela signifie que le fichier myfile.dat n'existe pas.

Vous obtiendrez la même erreur si le fichier est un lien symbolique pointant vers un fichier inexistant.

Comme vous le dites, quel que soit le dernier fichier à la $FILES, il ne sera pas ajouté au Zip avec l'avertissement. Je pense donc que quelque chose ne va pas dans la façon dont vous créez $FILES. Il y a de fortes chances qu'il y ait un retour à la ligne, un retour chariot, un espace, une tabulation ou tout autre caractère invisible à la fin du dernier nom de fichier, résultant en quelque chose qui n'existe pas. Essayez ceci par exemple:

for f in $FILES; do echo :$f:; done

Je parie que la dernière ligne sera incorrecte, par exemple:

:myfile.dat :

... ou quelque chose comme ça au lieu de :myfile.dat: sans aucun caractère avant le dernier :

MISE À JOUR

Si vous dites que le script a commencé à fonctionner après avoir exécuté dos2unix dessus, cela confirme ce que tout le monde soupçonnait déjà, qu'il y avait en quelque sorte un retour de voiture à la fin de votre $FILES liste.

od -c montre le\r retour chariot. Essayez echo $FILES | od -c

10
janos

Une autre cause possible qui peut générer un Zip warning: name not matched: erreur: l'une des variables d'environnement de Zip n'est pas définie correctement.

Depuis la page de manuel:

ENVIRONMENT
    The following environment variables are read and used by Zip as described.

ZIPOPT
    contains default options that will be used when running Zip.  The contents of this environment variable will get added to the command line just after the Zip command.

Zip
    [Not on RISC OS and VMS] see ZIPOPT

Zip$Options
    [RISC OS] see ZIPOPT

Zip$Exts
    [RISC OS] contains extensions separated by a : that will cause native filenames with one of the specified extensions to be added to the Zip file with basename and extension swapped.

Zip_OPTS
    [VMS] see ZIPOPT

Dans mon cas, j'utilisais Zip dans un script et j'avais l'emplacement binaire dans une variable d'environnement Zip afin que nous puissions passer facilement à un autre binaire Zip facilement sans faire de tonnes des changements dans le script.

Exemple:

Zip=/usr/bin/Zip
...
${Zip} -r folder.Zip folder

Ceci est ensuite traité comme:

/usr/bin/Zip /usr/bin/Zip -r folder.Zip folder

Et génère les erreurs:

Zip warning: name not matched: folder.Zip
zip I/O error: Operation not permitted
Zip error: Could not create output file (/usr/bin/Zip.zip)

Le premier, car il essaie maintenant d'ajouter folder.Zip à l'archive au lieu de l'utiliser comme archive. Les deuxième et troisième parce qu'il essaie d'utiliser le fichier /usr/bin/Zip.zip comme archive qui (heureusement) n'est pas accessible en écriture par un utilisateur normal.

Note: C'est une très vieille question, mais je n'ai trouvé cette réponse nulle part, donc je la poste pour aider les futurs chercheurs (mon futur moi-même inclus).

3
Dave Wood

eebbesen a frappé le clou dans son commentaire pour mon cas (mais je ne peux pas voter pour le commentaire). Une autre raison possible manquée dans les autres commentaires est que le fichier dépasse la limite de taille de fichier (4 Go).

1
chukko

Je viens de découvrir une autre cause potentielle à cela. Si les autorisations du répertoire/sous-répertoire ne permettent pas au Zip de trouver le fichier, il signalera cette erreur. En fait, si vous exécutez un chmod -R 444 sur le répertoire, puis essayez de le compresser, vous reproduirez cette erreur et aurez également un rapport "stocké à 0%", comme ceci:

Avertissement Zip: nom non apparié: borrar/enviar ajout: borrar/(stocké 0%)

Par conséquent, essayez de modifier les autorisations du fichier. Si vous essayez de les envoyer par e-mail et que ces filtres de messagerie (comme ceux de Gmail) inventent des filtres idiots pour ne pas envoyer d'exécutables, n'oubliez pas que le fait de rendre les autorisations très strictes lors de la compression Zip peut être la cause de l'erreur que vous signalez, de "nom ne correspond pas".

0
David L

les espaces ne sont pas autorisés:

il échouerait s'il y a plus d'un fichier dans $ FILES à moins que vous ne les mettiez en boucle

0
Mr.T

J'ai converti mon script pour l'environnement Unix en utilisant la commande dos2unix et exécuté mon script en tant que ./myscript.sh à la place bash myscript.sh.

0
Aparna Savant