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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 17 апреля 2019

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

getconf ARG_MAX

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

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

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

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

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

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

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

3 голосов
/ 17 апреля 2019

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//' {} \;

Примечания

  • Ни одно из решений не поддерживает {folder_name}, который запускаетсяс -.

  • Первые два переносимых решения не поддерживают имена файлов с некоторыми специальными символами в них.(Но вряд ли вы найдете эти символы в именах файлов в первую очередь.)

  • Решение GNU и первые два переносимых решения передают столько же имен файлов в perlнасколько это возможно (сводя к минимуму количество запусков perl), в то время как третье переносимое решение запускает процесс perl для каждого параметра.

  • echo - встроенная оболочка,таким образом, это не подчиняется системному ограничению на количество параметров, передаваемых утилитам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...