1
votes

Impossible d'exécuter "/ bin / sh": Liste d'arguments trop longue en perl

La commande ci-dessous dans le script perl échoue s'il y a beaucoup de fichiers dans @file_to_tar, mais cela fonctionne bien si nous avons moins de fichiers dans le tableau (@file_to_tar).

my $ tar_command = "cd $ ProcVars -> {dropbox_dir}; tar -cvzf SmartMiles. $ ProcVars -> {batch_nb} .tar.gz -P @file_to_tar --remove-files";

Quelqu'un peut-il m'aider à résoudre le problème.


0 commentaires

3 Réponses :


3
votes

Le meilleur moyen est de transmettre une très longue liste de fichiers à tar en utilisant l'option --from-file :

tar -czf myarchive.tar.gz -P --from-file=$filelist --remove-files

Vous pouvez également lui faire lire la liste des fichiers à partir de l'entrée standard en utilisant --from-file = -

Voir https://www.gnu.org/software/tar/manual/html_node/files.html pour plus d'informations .


1 commentaires

Merci beaucoup Bill pour votre suggestion. Je l'ai fait ci-dessous et cela fonctionne maintenant mon $ file_location = "$ ProcVars -> {dropbox_dir} /Archive_Files.csv"; open (DATA, "> $ file_location") ou die $ !; foreach $ a (@file_to_tar) {print DATA "$ a \ n"; } fermer DATA; my $ tar_command = "cd $ ProcVars -> {\ dropbox_dir}; tar -czf ABC. $ ProcVars -> {batch_nb} .tar.gz -P --files-from $ file_location --remove-files";



3
votes

Vous pourriez envisager, plutôt que d'appeler une commande shell, d'utiliser le module Archive :: Tar Perl à la place. En particulier, la rel = "nofollow noreferrer"> create_archive ". Cela éviterait également tout problème potentiel résultant de caractères spéciaux ou d'espaces dans les noms de fichiers interprétés par le shell que votre code Perl appelle.


1 commentaires

Salut Michael, Merci pour la réponse. Archive :: Tar n'est pas disponible dans notre commun Perl-core. J'ai donc utilisé --from-file = $ filelist et cela fonctionne très bien.



0
votes

cela fonctionne maintenant. my $ file_location = "$ ProcVars -> {dropbox_dir} /Archive_Files.csv"; open (DATA, "> $ file_location") ou die $ !; foreach $ a (@file_to_tar) {print DATA "$ a \ n"; } fermer DATA;

my $ tar_command = "cd $ ProcVars -> {\ dropbox_dir}; tar -czf ABC. $ ProcVars -> {batch_nb} .tar.gz -P --files-from $ file_location --remove-files";


0 commentaires