"-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
вариант.