Команда Perl не выполняется из-за слишком большого количества аргументов, как я могу это исправить, чтобы разрешить больше аргументов?

#linux #perl #command

#linux #perl #команда

Вопрос:

Я пытаюсь использовать эту команду:

 perl -i -p -e "s/r//" ./{folderName}/*.txt
 

Проблема в том, что у меня много файлов .txt в этой папке, и я предполагаю, что команда не может с этим справиться… Есть ли что-то еще, что я могу попробовать или сделать, чтобы исправить это?

Я получаю ошибку: «Список аргументов слишком длинный»

Я успешно использовал эту команду с папками меньшего размера (меньше файлов .txt), и она работает нормально.

Ответ №1:

В оболочке существует ограничение на входной аргумент. Это можно найти, выполнив команду ниже.

 getconf ARG_MAX
 

Если число аргументов больше, вы можете использовать другие методы, такие как канал или цикл for.

в качестве примера

 for txt in ./{folderName}/*.txt ; do perl -i -p -e "s/r//" "$txt"; done
 

или использование канала

 echo ./{folderName}/*.txt | xargs perl -i -p -e "s/r//" 
 

объяснение echo, как @ikegami, почему echo не выдает «слишком много аргументов»

причина в том, что echo является встроенной командой и не передает аргументы новому процессу.

Комментарии:

1. echo — это встроенная команда оболочки, и она не передает аргументы другому процессу, поэтому с echo она будет работать, но не с ls,

Ответ №2:

GNU:

 find {folder_name} -maxdepth 1 -name '*.txt' -exec perl -i -pe's/r//' {}  
 

Более переносимый:

 find {folder_name} -maxdepth 1 -name '*.txt' -print | xargs perl -i -pe's/r//'

echo {folder_name}/*.txt | xargs perl -i -pe's/r//'

find {folder_name} -maxdepth 1 -name '*.txt' -exec perl -i -pe's/r//' {} ;
 

Примечания

  • Ни одно из решений не поддерживает a {folder_name} , которое начинается с. -
  • Первые два переносимых решения не поддерживают имена файлов с некоторыми специальными символами в них. (Но маловероятно, что вы вообще найдете эти символы в именах файлов.)
  • Решение GNU и первые два переносимых решения передают как можно больше имен файлов perl (минимизируя количество запусков perl ), в то время как третье переносимое решение запускает perl процесс для каждого параметра.
  • echo это встроенная оболочка, поэтому на нее не распространяется ограничение системы на количество параметров, передаваемых утилитам.