Один из серверов разработки содержит миллионы файлов в одном каталоге.
Чтобы освободить место на диске, мы решили переместить их в новую папку, созданную на другом диске, подключенном к той же системе.
При попытке переместить файл с помощью команды mv была получена следующая ошибка.
-bash: /bin/mv: Argument list too long
Ошибка “Argument list too long”, как правило, возникает тогда, когда мы передаем большое количество параметров одной команде.
Системная переменная ARG_MAX определяет максимальную длину символов аргументов в команде оболочки.
Решение
Быстрое решение – использовать утилиту командной строки xargs или команду find с параметром -exec … {}.
Обе команды разбивают большую команду на более мелкие и выполняют работу без ошибок.
Использование find с xargs – Следующая команда переместит все файлы с расширением .txt в каталог назначения.
find . -name '*.txt' | xargs mv --target-directory=/path/to/dest_dir/
Использование find с exec – Вы также можете использовать exec для выполнения той же задачи.
find . -name '*.txt' -exec mv {} /path/to/dest_dir/ \;
Приведенные выше команды по умолчанию выполняют рекурсивный переход по подкаталогам.
Чтобы ограничить поиск только текущим каталогом, используйте -maxdepth с последующим ограничением количества подкаталогов.
find . -name '*.txt' -maxdepth 1 -exec mv {} /path/to/dest_dir/ \;
Максимальный предел можно узнать с помощью команды getconf ARG_MAX в shell.