Не могу выполнить c "/ bin / sh": список аргументов слишком длинный на perl - PullRequest
1 голос
/ 20 февраля 2020

Команда ниже в perl скрипт завершается неудачно, если в @file_to_tar много файлов, но работает нормально, если в массиве меньше файлов (@file_to_tar).

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

Может кто-нибудь помочь мне исправить проблема.

Ответы [ 3 ]

3 голосов
/ 20 февраля 2020

Вы можете рассмотреть вместо вызова команды оболочки использование модуля Archive :: Tar Perl. В частности, метод " create_archive ". Это также позволит обойти любые потенциальные проблемы, связанные со специальными символами или пробелами в именах файлов, которые интерпретируются оболочкой, которую вызывает ваш код Perl.

3 голосов
/ 20 февраля 2020

Лучший способ передать очень длинный список файлов на tar - использовать параметр --from-file:

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

Вы также можете сделать так, чтобы он читал список файлов со стандартного ввода, используя --from-file=-

См. https://www.gnu.org/software/tar/manual/html_node/files.html для получения дополнительной информации.

0 голосов
/ 20 февраля 2020

сейчас работает. my $ file_location = "$ ProcVars -> {dropbox_dir} /Archive_Files.csv"; open (DATA, "> $ file_location") или d ie $ !; foreach $ a (@file_to_tar) {печатать ДАННЫЕ "$ a \ n"; } закрыть данные;

my $ tar_command = "cd $ ProcVars -> {\ dropbox_dir}; tar -czf AB C. $ ProcVars -> {batch_nb} .tar.gz -P --files-from $ file_location - -remove-файлы ";

...