Linux rm слишком длинный список аргументов

Содержание
  1. bash: /bin/rm: Слишком длинный список аргументов
  2. Re: 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. Слишком длинный список аргументов: ошибка для команд rm, cp, mv
  20. Ответ 1
  21. Ответ 2
  22. Ответ 3
  23. Список аргументов слишком длинный для команд rm, cp, mv
  24. ОТВЕТЫ
  25. Ответ 1
  26. Ответ 2
  27. ТЛ; др
  28. Происхождение проблемы
  29. Решение: использование for цикла
  30. Решение: использование find
  31. Рекомендации
  32. Ответ 3
  33. Ответ 4
  34. Ответ 5
  35. Ответ 6
  36. Ответ 7
  37. Ответ 8
  38. Ответ 9
  39. Ответ 10
  40. Ответ 11
  41. Ответ 12
  42. Ответ 13
  43. Ответ 14
  44. Ответ 15
  45. Ответ 16
  46. Ответ 17
  47. Ответ 18
  48. Ответ 19
  49. Ответ 20
  50. Ответ 21
  51. Ответ 22
  52. Ответ 23
  53. Ответ 24
  54. Ответ 25
  55. Ответ 26
  56. Ответ 27
  57. Ответ 28
  58. Ответ 29
  59. Ответ 30

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. до сих пор удаляется.

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.

Источник

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

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

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

я получаю такую ошибку:

/bin/rm: cannot execute [Argument list too long].

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

Ответ 1

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

find . -name «*.pdf» -print0 | xargs -0 rm

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

find . -maxdepth 1 -name «*.pdf» -print0 | xargs -0 rm

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

find . -name «*.pdf» -delete

Ответ 2

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

Это системная проблема, связанная с execve и константой ARG_MAX. Об этом есть много документации (см. man execve, debian’s wiki). По сути, расширение выдает команду (с ее параметрами), которая превышает предел ARG_MAX. В ядре 2.6.23 этот предел был установлен на уровне 128 кБ. Эта константа была увеличена, и вы можете получить ее значение, выполнив:

Читайте также:  Для чего предназначена клавиша windows

# 2097152 # on 3.5.0-40-generic

Решение: Использование цикла for

Используйте цикл for, так как он рекомендован в BashFAQ/095 и нет никаких ограничений, кроме пространства оперативной/памяти. Проведите пробный запуск, чтобы убедиться, что он удалит то, что вы ожидаете:

for f in *.pdf; do echo rm «$f»; done

И выполните его:

for f in *.pdf; do rm «$f»; done

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

Замечание: Этот способ действительно медленнее, но он более удобен в обслуживании, поскольку может адаптировать более сложные сценарии, например, когда нужно выполнить более одного действия.

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

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

find . -maxdepth 1 -name ‘*.pdf’ -delete

Использование -maxdepth 1 . -delete вместо -exec rm <> + позволяет find просто выполнить необходимые системные вызовы самостоятельно, не используя внешний процесс, следовательно, быстрее.

Ответ 3

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

/bin/rm: Argument list too long.

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

find . -type f -exec rm -v <> \;

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

find . -type f –delete

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

find . -type f -print -delete

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

root@devel# ls -1 | wc -l && time find . -type f -delete

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Источник

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

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

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

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

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

ОТВЕТЫ

Ответ 1

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

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

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

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

Ответ 2

ТЛ; др

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

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

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

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

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

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

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

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

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

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

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

Рекомендации

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

Ответ 3

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

Ответ 4

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

echo *.pdf | xargs -n 100 rm

Ответ 5

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

Ответ 6

вы можете попробовать следующее:

EDIT: Комментарий ThiefMaster предлагает мне не раскрывать такую ​​опасную практику молодым оболочка jedis, поэтому я добавлю более «безопасную» версию (ради сохранения вещей, когда у кого-то есть файл «-rf. pdf» )

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

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

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

Ответ 7

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

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

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

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

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

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

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

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

Ответ 8

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

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

Ответ 9

вы можете использовать эту оценку

Ответ 10

У команды rm есть ограничение на количество файлов, которые вы можете удалить одновременно.

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

Вы также можете удалить их с помощью команды поиска:

Ответ 11

Если они являются именами файлов с пробелами или специальными символами, используйте:

Это предложение ищет все файлы в текущем каталоге (-maxdepth 1) с расширением pdf (-name ‘*.pdf’), а затем удаляет каждый из них (-exec rm «<>» ).

Выражение <> заменит имя файла, а «<>» задает имя файла как строку, включая пробелы или специальные символы.

Ответ 12

i столкнулась с такой же проблемой при копировании исходного каталога исходного кода в пункт назначения

исходный каталог имел файлы

я использовал cp с опцией -r, и это сработало для меня

cp -r abc/def/

он скопирует все файлы из abc в def без слишком долгого предупреждения о списке аргументов

Ответ 13

find. -type f -name ‘*xxx’ -print -delete

Ответ 14

Я удивлен, что здесь нет ulimit ответов. Каждый раз, когда у меня возникает эта проблема, я оказываюсь здесь или здесь. Я понимаю, что это решение имеет ограничения, но ulimit -s 65536 кажется, часто ulimit -s 65536 мне.

Ответ 15

printf — это встроенная оболочка, и, насколько я знаю, она всегда была таковой. Теперь, учитывая, что printf не является командой оболочки (но является встроенной), она не подвержена фатальной ошибке » argument list too long. «.

Таким образом, мы можем безопасно использовать его с шаблонами сглаживания оболочки, такими как *.[Pp][Dd][Ff] , затем передаем по выводу команду на удаление ( rm ) через xargs , что позволяет убедиться, что оно соответствует достаточным именам файлов в команде строка, чтобы не пропустить команду rm , которая является командой оболочки.

\0 в printf служит нулевым разделителем для имен файлов, которые затем обрабатываются командой xargs , используя ее ( -0 ) в качестве разделителя, поэтому rm не -0 ошибкой, если в файле есть пробелы или другие специальные символы имена.

Ответ 16

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

В итоге я написал python script для удаления файлов на основе первых 4 символов в имени файла:

Это работало очень хорошо для меня. Я смог очистить более 2 000 файлов temp в папке примерно через 15 минут. Я прокомментировал tar из небольшого числа кода, поэтому любой, обладающий минимальным знанием питона, может манипулировать этим кодом.

Читайте также:  Напоминание дней рождения для windows

Ответ 17

Я знаю только об этом. Идея состоит в том, чтобы экспортировать этот список файлов PDF, которые у вас есть, в файл. Затем разделите этот файл на несколько частей. Затем удалите pdf файлы, перечисленные в каждой части.

wc -l — подсчитать, сколько строк содержится в файле list.txt. Когда у вас есть представление о том, как долго это происходит, вы можете решить разделить его на полтора-четвертого или что-то еще. Использование команды split -l Например, разделите его по 600 строк.

это создаст несколько файлов с именем xaa, xab, xac и т.д., зависит от того, как вы его разделяете. Теперь, чтобы «импортировать» каждый список в этот файл в команду rm, используйте это:

Извините за мой плохой английский.

Ответ 18

Я обнаружил, что для очень больших списков файлов (> 1e6) эти ответы были слишком медленными. Вот решение, использующее параллельную обработку в Python. Я знаю, я знаю, что это не Linux. но ничего другого здесь не работает.

(Это спасло меня часы)

Ответ 19

Попробуйте это также. Если вы хотите удалить более 30/90 дней (+) или еще ниже 30/90 (-) дней файлов/папок, вы можете использовать приведенные ниже команды ex

Ex: В течение 90 дней исключается выше после того, как удалены файлы/папки 90 дней, это означает 91,92. 100 дней

Пример: для последних 30 дней файлов, которые вы хотите удалить, используйте следующую команду (-)

Если вы хотите giz файлы для файлов более чем на 2 дня

Если вы хотите просмотреть файлы/папки только за последний месяц. Пример:

Выше 30 дней больше, а затем список файлов/папок Пример:

Ответ 20

Удалить все *.pdf в каталоге /path/to/dir_with_pdf_files/

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

(Необязательный шаг): DRY RUN. Чтобы проверить, что будет удалено без удаления. ‘

Нажмите rsync советы и хитрости для более rsync хаков

Ответ 21

Вы можете создать временную папку, переместить все файлы и подпапки, которые вы хотите сохранить, во временную папку, затем удалить старую папку и переименовать временную папку в старую папку, попробуйте этот пример, пока вы не будете уверены, что все это работает:

rm -r big_folder удалит все файлы в big_folder независимо от их количества. Вы просто должны быть очень осторожны, у вас сначала есть все файлы/папки, которые вы хотите сохранить, в данном случае это был file1.pdf

Ответ 22

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

Ответ 23

Я столкнулся с подобной проблемой, когда приложение создавало миллионы бесполезных файлов журналов, которые заполняли все иноды. Я прибег к «locate», собрал все файлы, «расположенные» d, в текстовый файл, а затем удалил их один за другим. Потребовалось время, но сделал работу!

Ответ 24

Предположим, что введено имя входного каталога и выведено имя выходного каталога. Затем вы можете использовать простой цикл для копирования всех

Ответ 25

У меня была та же проблема с папкой, полной временных изображений, которые росли день ото дня, и эта команда помогла мне очистить папку

Разница с другими командами — это параметр mtime, который будет принимать только файлы старше X дней (в примере 50 дней)

Используя это несколько раз, уменьшая при каждом выполнении дневной диапазон, я смог удалить все ненужные файлы

Ответ 26

Если у вас есть похожие проблемы с grep, самым простым решением является переход на один каталог обратно и выполнение рекурсивного поиска.

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

Обратите внимание, что он также будет рекурсивно искать подпапки в каталоге «search_in_this_dir».

Ответ 27

Более безопасная версия, чем использование xargs, также не рекурсивная: ls -p | grep -v ‘/$’ | grep ‘\.pdf$’ | while read file; do rm «$file»; done

Фильтрация наших каталогов здесь немного не нужна, так как «rm» в любом случае не удалит ее, и ее можно удалить для простоты, но зачем запускать что-то, что обязательно вернет ошибку?

Ответ 28

Использование GNU parallel ( sudo apt install parallel ) очень просто

Он выполняет команды многопоточности, где ‘<>‘ — это аргумент, переданный

ls /tmp/myfiles* | parallel ‘rm <>‘

Ответ 29

Для удаления первых 100 файлов:

rm -rf ‘ls | голова -100 ‘

Ответ 30

Этот параметр кажется простым для этой проблемы. Я получил эту информацию из какой-то другой темы, но это помогло мне.

Просто запустите указанную выше команду, и она выполнит задачу.

Источник

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