Linux bash слишком много аргументов

Содержание
  1. Не работает скрипт: слишком много аргументов
  2. bash: /bin/rm: Слишком длинный список аргументов
  3. Re: bash: /bin/rm: Слишком длинный список аргументов
  4. Re: bash: /bin/rm: Слишком длинный список аргументов
  5. Re: bash: /bin/rm: Слишком длинный список аргументов
  6. Re: bash: /bin/rm: Слишком длинный список аргументов
  7. Re: bash: /bin/rm: Слишком длинный список аргументов
  8. Re: bash: /bin/rm: Слишком длинный список аргументов
  9. Re: bash: /bin/rm: Слишком длинный список аргументов
  10. Re: bash: /bin/rm: Слишком длинный список аргументов
  11. Re: bash: /bin/rm: Слишком длинный список аргументов
  12. Re: bash: /bin/rm: Слишком длинный список аргументов
  13. Re: bash: /bin/rm: Слишком длинный список аргументов
  14. Re: bash: /bin/rm: Слишком длинный список аргументов
  15. Re: bash: /bin/rm: Слишком длинный список аргументов
  16. Re: bash: /bin/rm: Слишком длинный список аргументов
  17. Re: bash: /bin/rm: Слишком длинный список аргументов
  18. Re: bash: /bin/rm: Слишком длинный список аргументов
  19. Re: bash: /bin/rm: Слишком длинный список аргументов
  20. Скрипт Bash: слишком много аргументов в [test]
  21. 4 ответа
  22. Слишком длинный список аргументов для команд rm, cp, mv
  23. ТЛ; др
  24. Происхождение проблемы
  25. Решение: использование for Loop
  26. Решение: Использование find
  27. Ссылки
  28. Bash cd слишком много аргументов
  29. 4 ответа
  30. Краткий ответ / Временное решение
  31. Что изменилось?
  32. Ответы (1)

Не работает скрипт: слишком много аргументов

День/Вечер добрый. Тут решил засесть за книжку «Сценарии командной оболочки» и на втором скрипте получил ошибку. далее привожу код скрипта и ошибки.

Еще простой (наверное) вопрос, если пошлете учить матчасть — укажите направление 🙂

Все, что в двойных скобкаъ считается одним словом, разбивки не происходит, это эквивалентно directory=$ourpath

А здесь двойных скобок нет, поэтому разбивка слов происходит и команда разбивается на if [ -x /bin /usr/bin … и что там ещё в $PATH

google://advanced bash scripting guide

Благодарю, после того, как убрал двойные кавычки в $ourpath, все заработало! А что за двойные скобки?

Тему можно считать решенной, если знаете, помогите с последним вопросом (он выше, в конце темы), и закроем ее :3

Так потому что разбор $ourpath на слова уже произошёл.

$0 — имя файла вызываемого скрипта

почитаем про это, благодарю))

Когда СКРИП не работает, тут надо к физикам, умвр, если поелозить — скрипитъ.

fuck, thank you :3

вместо всего вашего велосипеда, ну да ладно.

Благодарю) Эт не велосипед, это, простите за плохие слова, код авторов книги.

Ну, во-первых, это не полный аналог, так как сообщения «в PATH есть/нет» type и не печатает. Во-вторых, написанный скрипт всегда гибче, можно расширить ещё на какое спец. действие, в конце концов можно и починить, чтобы на исполняемые файлы по абсолютному пути не писало, что они в PATH, а потом навернуть логику, проверяющую, что этот абсолютный путь и сам есть в PATH.

Источник

bash: /bin/rm: Слишком длинный список аргументов

Хех, первый раз такое встречаю —

rm tmp/* -bash: /bin/rm: Слишком длинный список аргументов

Re: bash: /bin/rm: Слишком длинный список аргументов

Ваш люникс даже удалить файлы не может.

Re: bash: /bin/rm: Слишком длинный список аргументов

find / -exec rm -f ‘<>‘ ‘;’

Re: bash: /bin/rm: Слишком длинный список аргументов

find /tmp -mindepth 1 -maxdepth 1 -delete

Re: bash: /bin/rm: Слишком длинный список аргументов

Re: bash: /bin/rm: Слишком длинный список аргументов

«rm -rf /», чего уж там

Re: bash: /bin/rm: Слишком длинный список аргументов

+1 🙂 xargs рулит. через find будет слишком медленно.

Re: bash: /bin/rm: Слишком длинный список аргументов

если не ошибаюсь — больше 64К файлов не удаляет.

Re: bash: /bin/rm: Слишком длинный список аргументов

уже больше часа удаляется

Re: bash: /bin/rm: Слишком длинный список аргументов

Это что туда понапихали?

Re: bash: /bin/rm: Слишком длинный список аргументов

find / -delete будет быстрее xargs

Re: bash: /bin/rm: Слишком длинный список аргументов

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

Re: bash: /bin/rm: Слишком длинный список аргументов

>find / -exec rm -f ‘<>‘ ‘;’
жестоко ты) ибо, кажись, он повелся.

Re: bash: /bin/rm: Слишком длинный список аргументов

да я сделал через find, и само собой я не тупо скопировал /

p.s. до сих пор удаляется.

Читайте также:  Xmos xu208 driver для windows 10

Re: bash: /bin/rm: Слишком длинный список аргументов

xargs без опции -n1 вполне себе быстр, только с пробелами фигня

Re: bash: /bin/rm: Слишком длинный список аргументов

>p.s. до сих пор удаляется.
видимо, потому что -exec
попробуй через -delete

Re: bash: /bin/rm: Слишком длинный список аргументов

запустил с -delete

Re: bash: /bin/rm: Слишком длинный список аргументов

Если на каждый файл делать exec, тогда, конечно медленно.
Надо использовать find — delete.

Источник

Скрипт Bash: слишком много аргументов в [test]

У меня есть скрипт bash ниже:

Когда я запускаю это:

Как видите, когда я не передаю параметры ($ # -eq 0), происходит сбой с «слишком большим количеством аргументов». Итак, я проверил это прямо в терминале:

Итак, если он отлично работает в терминале, почему не работает передача параметров?

4 ответа

Все ваше выражение может быть упрощено до:

Это проверяет, равна ли полная сумма аргументов нулю или аргумент (ы) равен «—help». Если любая из этих двух вещей верна, то она переходит к функции help , в противном случае выведите «done» и завершите работу.

Когда вы выполняете скрипт без параметра, вы получаете ошибку, потому что ваше условие совпадает с пустым символом, см. Ниже —

Как вы можете видеть, что нет никакого значения, чтобы соответствовать.

Когда вы выполните команду ниже в вашем терминале —

Чтобы решить эту проблему, вы можете использовать условие if в начале, чтобы назначить фиктивное значение, если его нет.

[$ # -eq 1] || [$ 1 = «—help»] || [$ # -eq 0]

Таким образом, он будет автоматически отображаться, если указан ключ —help или 1.

Я думаю, что $ # создает проблему, так как есть и $ # для первого и второго условий

Выразите свое состояние следующим образом:

На самом деле, [ является командой, а следующие элементы в командах могут быть разделены по словам. Если аргумент пуст (или содержит пробелы и не заключен в кавычки), вы можете столкнуться с неожиданностями. Использование -a и -o не рекомендуется.

Обратите внимание, что если вы хотите использовать логический оператор && (вместо оператора if ) перед вашим оператором echo , вам необходимо заключить вышеуказанные внутренние скобки, иначе оператор приоритет (в сочетании с ленивой оценкой) может дать неверные результаты.

Если вы не возражаете против использования специфичного для Bash синтаксиса, вы также можете написать:

Обратите внимание, что в этом случае двойные кавычки $1 не требуются, поскольку конструкция [[ ]] является специальным синтаксисом оболочки, а не командой, а то, что внутри, не подлежит разбиению по словам. Поскольку существует один тест, вам не нужно заключать его в фигурные скобки перед вашим && < echo. .

Источник

Слишком длинный список аргументов для команд rm, cp, mv

У меня есть несколько сотен PDF-файлов в каталоге в UNIX. Названия PDF-файлов действительно длинные (около 60 символов).

Когда я пытаюсь удалить все PDF-файлы вместе, используя следующую команду:

Я получаю следующую ошибку:

Каково решение этой ошибки? Возникает ли эта ошибка для mv и cp команды, а? Если да, как решить для этих команд?

Причина этого заключается в том, что bash фактически расширяет звездочку до каждого соответствующего файла, создавая очень длинную командную строку.

Предупреждение: это рекурсивный поиск, который также найдет (и удалит) файлы в подкаталогах. Придерживайтесь -f команды rm, только если вы уверены, что не хотите подтверждения.

Чтобы сделать команду нерекурсивной, вы можете сделать следующее:

Другой вариант — использовать -delete флаг поиска :

ТЛ; др

Это ограничение ядра на размер аргумента командной строки. for Вместо этого используйте цикл.

Происхождение проблемы

Это системная проблема, связанная execve и ARG_MAX постоянная. Об этом много документации (см. Man execve , вики Debian ).

По сути, расширение создает команду (с ее параметрами), которая превышает ARG_MAX предел. На ядре 2.6.23 ограничение было установлено на 128 kB . Эта константа была увеличена, и вы можете получить ее значение, выполнив:

Решение: использование for Loop

Используйте for цикл, как это рекомендуется для BashFAQ / 095, и нет никаких ограничений, за исключением объема ОЗУ / памяти:

Пробный запуск, чтобы убедиться, что он удалит то, что вы ожидаете:

И выполнить это:

Также это переносимый подход, поскольку у glob сильное и согласованное поведение среди оболочек ( часть спецификации POSIX ).

Читайте также:  Windows store microsoft edge

Примечание. Как отмечается в нескольких комментариях, это действительно медленнее, но более приемлемо, поскольку может адаптировать более сложные сценарии, например, когда требуется выполнить больше, чем одно действие.

Решение: Использование find

Если вы настаиваете, вы можете использовать, find но на самом деле не используйте xargs, поскольку он «опасен (сломан, может использоваться и т. Д.) При чтении ввода, не разделенного NUL» :

Использование -maxdepth 1 . -delete вместо -exec rm <> + позволяет find просто выполнять необходимые системные вызовы без использования внешнего процесса, следовательно, быстрее (благодаря комментарию @chepner ).

Ссылки

  • Я получаю «Список аргументов слишком длинный». Как я могу обработать большой список кусками? @ wooledge
  • execve (2) — справочная страница по Linux (поиск ARG_MAX);
  • Ошибка: слишком длинный список аргументов @ вики Debian;
  • Почему я получаю «/ bin / sh: список аргументов слишком длинный» при передаче аргументов в кавычках? @ SuperUser

find имеет -delete действие:

Другой ответ состоит в том, чтобы заставить xargs обрабатывать команды в пакетном режиме. Например, к delete файлам 100 за раз, cd в каталог и запустите это:

echo *.pdf | xargs -n 100 rm

Или вы можете попробовать:

Если вы пытаетесь удалить очень большое количество файлов за один раз (сегодня я удалил каталог с 485 000+), вы, вероятно, столкнетесь с этой ошибкой:

Проблема заключается в том, что когда вы набираете что-то вроде rm -rf * , то * заменяется списком каждого соответствующего файла, например, «rm -rf file1 file2 file3 file4» и так далее. Для хранения этого списка аргументов имеется относительно небольшой буфер памяти, и, если он заполнен, оболочка не выполнит программу.

Чтобы обойти эту проблему, многие люди используют команду find, чтобы найти каждый файл и передать их один за другим команде «rm», например так:

Моя проблема в том, что мне нужно было удалить 500 000 файлов, и это заняло слишком много времени.

Я наткнулся на гораздо более быстрый способ удаления файлов — команда «find» имеет встроенный флаг «-delete»! Вот что я в итоге использовал:

Используя этот метод, я удалял файлы со скоростью около 2000 файлов в секунду — намного быстрее!

Вы также можете показать имена файлов при их удалении:

. или даже показать, сколько файлов будет удалено, а затем время, необходимое для их удаления:

Вы можете попробовать это:

РЕДАКТИРОВАТЬ: комментарий ThiefMaster предлагает мне не раскрывать такую ​​опасную практику для джедаев молодой оболочки, поэтому я добавлю более «более безопасную» версию (ради сохранения вещей, когда у кого-то есть файл «-rf. ..Pdf»)

После запуска вышеприведенного, просто откройте файл /tmp/dummy.sh в вашем фаворе. редактировать и проверять каждую строку на наличие опасных имен файлов, комментируя их, если они найдены.

Затем скопируйте скрипт dummy.sh в ваш рабочий каталог и запустите его.

Все это по соображениям безопасности.

Вы можете использовать массив bash:

Таким образом, он будет стирать партиями по 1000 файлов за шаг.

Источник

Bash cd слишком много аргументов

Я только что обновил Ubuntu 16.04 до 17.04 и нашел небольшую проблему с командой cd .

Предположим, что у меня есть две папки: album-01 & amp; album-02

В Ubuntu 16.04, если я делаю cd album* , он перейдет в первую найденную папку album-01

Но в новом Ubuntu 17.04, если я сделаю cd album* , это приведет меня -bash: cd: too many arguments

Как сделать cd в Ubuntu 17.04 как cd в Ubuntu 16.04?

4 ответа

Я не мог проверить это на реальной системе 17.04 (только проверено, что оно работает с 16.04), но вы можете переопределить встроенную команду cd Bash с вашей собственной пользовательской функцией, которая отбрасывает любые дополнительные аргументы, кроме первого:

Обновление: Как указано в комментарий @ muru , эта версия ниже может работать лучше и поддерживать вызов cd без аргументов:

После того, как вы ввели эту строку выше в своем терминале, убедитесь, что теперь cd ведет себя так, как вы хотите. Если это так, вы можете сделать это определение функции постоянным, добавив эту строку в конец вашего файла

/.bashrc . В противном случае он исчезнет, как только вы закончите текущий сеанс оболочки.

Обратите внимание: если по какой-либо причине вам временно необходимо использовать настоящую команду cd Bash вместо этой настраиваемой функции, вы можете просто вызвать ее с помощью command cd вместо простого cd .

Читайте также:  Что может windows surface

Краткий ответ / Временное решение

Чтобы ответить на ваш вопрос в этом конкретном случае, это работает

Но это, вероятно, не функциональность, которую вы действительно хотите.

Что изменилось?

Похоже, что config-top.h в Bash- 4.4 была обновлена, чтобы добавить следующий параметр

И builtins/cd.def относится к вашей ошибке здесь

Что я могу сделать в долгосрочной перспективе?

Вы можете скомпилировать свой собственный bash без нового CD_COMPLAINS , но это утомительно. Вы можете переопределить функциональность cd , как предлагается здесь, или вы могли бы использовать функцию типа

Доказательство

Bash 4.4 Beta, где он все еще работает

Bash 4.4 Стабильный релиз, где он не работает

Я никогда не сталкивался с этой проблемой, поскольку я всегда использую Завершение вкладки.

Итак, в вашем случае вместо того, чтобы иметь неточное предположение относительно того, какой каталог я хочу, я бы набрал cd al Tab , который, если есть только одно совпадение, завершает его, и если есть 2 или больше завершается до конца совпадения, а вкладка Tab перечисляет варианты.

Вот пример из моей системы:

, а затем вкладка вкладка создает

Это выглядит как ошибка в Bash: per man builtins старое поведение является правильным.

Вы можете сообщить об ошибке в списке рассылки bug-bash ; подробнее здесь .

Собственно, ошибка была сообщена (давно). Если вы хотите установить фиксированный Bash сейчас, теперь now , вот как это сделать правильно (тестирование на 17.10, также должно работать и на других).

Сначала создайте каталог для работы, например:

Получить исходный пакет и зависимости сборки:

Измените config-top.h , чтобы изменить это (должна быть строка 32)

Измените debian/changelog и добавьте запись вверху (вы также можете использовать команду dch -i ):

Наиболее важными моментом является добавление +foo к текущему номер версии ( foo может быть любой строкой строчных букв и быть осторожным, если вы используете dch -i , он будет увеличивать последнее число, поэтому вам нужно вернуть его на текущий) и использовать правильное имя выпуска ( artful здесь). Наконец, запустите dpkg-source –commit .

Затем вы можете запустить команду debuild , и если все будет хорошо (ошибки в debsign могут быть проигнорированы), у вас должно быть некоторое количество .deb s в родительском каталоге, которое вы можете установить как обычно (есть нет необходимости устанавливать их все, только те, которые у вас есть сейчас, используйте dpkg -l | grep bash , чтобы узнать).

Обратите внимание, что номер версии нового пакета установлен так, что вы автоматически получите какое-либо будущее обновление bash ; если обновление не устраняет проблему, вам необходимо повторить описанный выше процесс.

(Этот ответ был впервые отправлен на этот дублированный вопрос .)

Want to improve this question? Update the question so it’s on-topic for Stack Overflow.

Closed 10 months ago .

I’m new to Ubuntu. I tried to open a file with name which has space in it. I used cd command. it shows bash : cd : too many arguments

Whenever a file name has a space in it. It is showing this error. What should I do?

24 просмотра

1 ответ

6 Репутация автора

Я относительно новичок в командной строке. Я установил терминал Hyoer, и смена каталога в CD работала очень хорошо. сегодня всякий раз, когда я пытаюсь изменить каталог с помощью cd, он выдает мне bash: cd: слишком много аргументов. Я не могу двигаться ниже, чем каталог по умолчанию, который является пользователями.

Ответы (1)

1833 Репутация автора

cd требуется ровно 1 аргумент: имя каталога, на который вы меняете. Вы указали более одного аргумента.

Есть несколько причин, почему cd можно получить более 1 аргумента. Например, я ленивый типер, поэтому я часто использую * , как в:

Это работает, пока я не создаю каталог very_important_files .

Однако наиболее очевидным является то, что в имени каталога есть пробел. Например, если у вас есть каталог с именем directory with space , и вы это сделаете cd directory with space , bash интерпретирует это как команду cd с тремя аргументами:

Что не то, что вы хотите. Вы можете заставить bash рассматривать его как один аргумент, заключив его в кавычки: cd «directory wth space»

Источник

Оцените статью