"-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,

  1. Эта команда имеет-execвариант, который работает аналогичноxargsтак что нам не нужно xargs в этом случае вообще.
  2. Чтобы имитировать поведение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 вариант.

Другие вопросы по тегам