/ bin / ls: список аргументов слишком длинный - PullRequest
0 голосов
/ 11 февраля 2020

Попытка преобразовать учетную запись Twitter с более чем 10 000 твитов в другой формат с помощью сценария bash на максимальной MBP 16 "с последней версией MacOS.

После нескольких минут работы, выдающих много периодов, он говорит , line 43: /bin/ls: Argument list too long. Предполагая, что эта проблема относится к числу твитов, поэтому, хотя я и мог попытаться разбить на мелкие кусочки в качестве крайней меры, не зная, какое максимальное число нужно избежать, решил сначала поискать решение.

Поиск Google и SO и обнаружил, "bash: / bin / ls: список аргументов слишком длинный ". Если моя проблема такая же, это звучит как замена "ls" на "find -name "может помочь. Попытка и та же ошибка, но, возможно, неправильный синтаксис.

В настоящее время используются две строки, использующие" ls "(первая - та, на которую в настоящее время жалуется ошибка):

for fileName in `ls ${thisDir}/dotwPosts/p*` ; do

и

printf "`ls ${thisDir}/dotwPosts/p* | wc -l` posts left to import.\n"

Попытка изменить первую строку на (с ошибкой "1016 *).

for fileName in `find -name ${thisDir}/dotwPosts/p*` ; do

Может потребоваться ввести дополнительный код, но не Я не хочу делать вопрос слишком конкретным c для моих нужд и более общим, надеюсь, для других, видящих эту общую ошибку, когда другой ответ stackoverflow, кажется, не применим.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Чтобы перебрать файл в каталоге в bash, выведите имена файлов в виде потока, разделенного нулями, и прочитайте его. Таким образом, вам не нужно хранить все имена файлов одновременно в любом месте:

find "${thisDir}/dotwPosts/" -maxdepth 1 -type f -name 'p*' -print0 |
while IFS= read -d '' -r file; do
   printf "%s\n" "$file"
done

Чтобы получить счетчик, выведите по одному символу для каждого файла и подсчитайте символы:

find "${thisDir}/dotwPosts/" -maxdepth 1 -type f -name 'p*' -printf . | wc -c

Не используйте `backticks, они не рекомендуется. Bash Вики-хакеры не одобряют и осуждают синтаксис . Вместо этого используйте $(...).

for fileName in $(...) - это обычный антипаттерн в bash. Скорее всего, если вы хотите перебрать выходные данные другой команды, вы должны использовать while IFS= read -r line l oop. bashfaq Как я могу прочитать файл (поток данных, переменную) построчно (и / или поле за полем)?

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

Попробуйте:

for file in "${thisDir}/dotwPosts/p"*
do
    # exclude non plain files
    [[ -f $file ]] || continue 
    # do something with "$file"
    ...
done

Я цитировал "${thisDir}/dotwPosts/p", поэтому var thisDir не может содержать соответствующие символы подстановки, но работает с пробелами. В противном случае удалите кавычки.

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