"-bash: /usr/bin/rename: список аргументов слишком длинный"
Я хотел бы переименовать файлы в каждом подкаталоге, добавив имя подкаталога. После ответа от переименования файлов, добавив имя их родительской папки, я попытался:
rename 's/(.*)\//$1\/$1_/' */*
Однако для многих подкаталогов это не работает. У меня есть 13000 подкаталогов, каждый из которых содержит около 300 файлов. я получил
-bash: /usr/bin/rename: Argument list too long
Я старался:
ls | xargs rename 's/(.*)\//$1\/$1_/' */*
find . -maxdepth 1 -type f -print0 | xargs rename 's/(.*)\//$1\/$1_/' */*
Оба выдают одну и ту же ошибку:
-bash: /usr/bin/xargs: Argument list too long
РЕДАКТИРОВАТЬ
xargs -L rename 's/(.*)\//$1\/$1_/' */*
xargs -L1 rename 's/(.*)\//$1\/$1_/' */*
Та же ошибка:
-bash: /usr/bin/xargs: Argument list too long
1 ответ
Как заметил @egmont, давая пути (*/*) в качестве аргумента (-ов) для xargsнеправильно. Эта команда читает имена файлов из стандартного ввода вместо аргументов, поэтомуxargsбез какого-либо стандартного ввода (раздел вопроса EDIT) бесполезно.
Решение с использованиемlsа такжеxargs
Проверьте, можете ли вы простоlsвсе пути в вопросе.
ls */*
Если да, вы можете использовать исправленную версию вашего 2) варианта:
ls */* | xargs rename -n 's/(.*)\//$1\/$1_/'
Решение с использованиемfind
Если вы получили ошибку отlsзвоните, вы все еще можете использоватьfind,
- Эта команда имеет
-execвариант, который работает аналогичноxargsтак что нам не нужноxargsв этом случае вообще. - Чтобы имитировать поведение
ls */*, используйте параметры-mindepth 2 -maxdepth 2,
Исправленная версия опции 3) будет выглядеть так:
find . -mindepth 2 -maxdepth 2 -type f -exec rename -n 's/(.*)\//$1\/$1_/' {} \;
Заполнитель аргумента и точка с запятой ({} \;) гарантирует, чтоrenameзапускается только для одного файла за раз, аналогичноxargs -L1, Это предотвратит исходную проблему со слишком большим количеством файлов одновременно.
Пробный запуск и реальное переименование
Вы можете проверить результат, используя-nвариант, который я включил послеrenameпросто перечислить переименования это будет делать. Чтобы фактически запустить операцию переименования, удалите -n вариант.