Один из серверов разработки содержит миллионы файлов в одном каталоге.

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

При попытке переместить файл с помощью команды 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.

Поделитесь статьей:

Добавить комментарий