#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
это встроенная оболочка, поэтому на нее не распространяется ограничение системы на количество параметров, передаваемых утилитам.