commande zip ne fonctionne pas

J’essaie de compresser un fichier en utilisant 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 une chose de plus, j’ai observé que le fichier qui se trouve enfin dans la liste des fichiers d’un dossier contient 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.

avertissement zip: nom non correspondant: myfile.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 de $FILES , il ne sera pas ajouté au zip avec l’avertissement. Donc, je pense que quelque chose ne va pas avec la façon dont vous créez les $FILES . Il y a des chances qu’il y ait une nouvelle ligne, un retour chariot, un espace, un onglet ou un autre caractère invisible à la fin du dernier nom de fichier, entraînant 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 caractères avant le dernier :

METTRE À JOUR

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

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

Une autre cause possible pouvant générer un zip warning: name not matched: erreur est d’avoir des variables d’environnement zip définies de manière incorrecte.

De 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 je disposais d’un emplacement binary dans une variable d’environnement ZIP afin que nous puissions passer facilement à un fichier binary zip différent sans apporter beaucoup de modifications au 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’append folder.zip à l’archive au lieu de l’utiliser comme archive. Le deuxième et le troisième parce qu’il essaie d’utiliser le fichier /usr/bin/zip.zip comme archive qui n’est (heureusement) pas accessible en écriture pour un utilisateur normal.

Note : Ceci est une très vieille question, mais je n’ai trouvé cette réponse nulle part, alors je la poste pour aider les futurs chercheurs (mon futur moi inclus).

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 le fichier dépassant la limite de taille de fichier (4 Go).

Je viens de découvrir une autre cause potentielle pour cela. Si les permissions du répertoire / sous-répertoire ne permettent pas au fichier 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 trouvé: borrar / enviar ajoutant: borrar / (stocké 0%)

Essayez donc de modifier les permissions du fichier. Si vous essayez de les envoyer par courrier électronique et que ces filtres de messagerie (comme ceux de Gmail) inventent des filtres stupides pour ne pas envoyer d’exécutables, n’oubliez pas que rendre les permissions très ssortingctes lors de la compression zip peut être la cause de l’erreur que vous signalez. de “nom non apparié”.

les espaces ne sont pas autorisés:

il échouerait s’il y avait plusieurs fichiers dans $ FILES sauf si vous les mettez en boucle

J’ai converti mon script pour l’environnement Unix en utilisant la commande dos2unix et exécuté mon script sous la forme ./myscript.sh au lieu de bash myscript.sh.