Рейтинг:-2

Как переименовать файлы в ubuntu рекурсивно, используя grep и переименовать, не найти?

флаг cn

Есть миллионы вопросов и ответов о том, как переименовывать файлы. Я новичок в Linux, и это множество возможных способов, разных результатов и разных конфигураций меня смущает.

Например:

  • переименовать работает, но не рекурсивно
  • grep работает рекурсивно, но не может использоваться для поиска имен файлов и каталогов вместо содержимого файла
  • найти работает, но имеет длинный уродливый синтаксис, когда вы хотите искать с использованием регулярных выражений.

А также много ответов на спроси убунту и переполнение стека у меня не работают, и я не знаю, как их отлаживать и устранять неполадки.

Так что извините, что спрашиваю еще раз.

Я ищу чистую, запоминающийся способ:

Рекурсивное переименование файлов с помощью простого регулярного выражения.

Я уже делаю это для содержимого файлов, используя этот синтаксис:

grep -rl search_regex | xargs sed -i 's/old/new/g'

Работает без особых нареканий. Он работает из коробки. Это просто работает. Я ищу работоспособное решение, аккуратное и чистое. Не могли бы вы мне помочь?

muru avatar
флаг us
«Чистый», «запоминающийся», «некрасивый» — все в глазах смотрящего. На этот вопрос нельзя дать объективный ответ, и его следует закрыть как основанный на мнении.
Saeed Neamati avatar
флаг cn
@muru, на него уже ответили.
muru avatar
флаг us
Я вижу это, и, судя по качеству принятого ответа, то, что я сказал, остается правдой.
lys avatar
флаг nl
lys
Поиск Google привел меня сюда. Ответ ниже с использованием `globstar` помог мне решить ту же проблему.
Рейтинг:4
флаг in

Не могу найти ничего длинного и уродливого в найти:

найти . -regex 'search_regex' -exec переименовать 's/old/new/g' {} +
Saeed Neamati avatar
флаг cn
Если вы видите ответ @wizardpurple, вы понимаете, что этот синтаксис уродлив. Почему я должен указывать переключатель `-regex`? Также зачем `-exec`, когда я могу использовать простой канал? А что это за "+" в конце? Также с помощью `grep` я могу опустить эти одинарные кавычки вокруг моего регулярного выражения. `найти . | поиск | переименовать 's/old/new/g'`.
pLumo avatar
флаг in
Ваши аргументы неверны. Почему pipe лучше, чем `-exec`? Pipe вводит проблемы (см. мой комментарий к ответу @wizardpurple). Кстати: вы не можете опускать кавычки вокруг своего регулярного выражения, это просто неправильно.
pLumo avatar
флаг in
Если уродливое/сложное означает * «Я не знаю синтаксиса» *, возможно, вы правы. Я думаю, что pipe и `grep` более сложны, особенно когда вы заботитесь о связанных с этим проблемах (которые не заботятся в его ответе).
Saeed Neamati avatar
флаг cn
уродливый и сложный означает, что, прочитав почти 20 вопросов, я не смог решить свою проблему. Чистый означает, что после прочтения одного простого ответа моя проблема решена. Я не говорю о моем понимании в качестве критериев простоты. Я говорю о производительности в качестве критерия здесь.
pLumo avatar
флаг in
и почему этой команды «найти» недостаточно для «*моя проблема решена*»? Это чище, быстрее и имеет меньше проблем.
Saeed Neamati avatar
флаг cn
О проблемах я рассказал в предыдущем комментарии. Универсальность имеет значение. Когда я использую `grep`, мне не нужно заключать его в одинарные кавычки. Я имею дело с **ONE** универсальным синтаксисом. Я также знаю, что всегда работаю с регулярными выражениями.Кроме того, окантовка — это самый простой способ комбинировать вещи. Трубопровод намного проще, чем знание переключателей. Это мои причины продуктивности.
pLumo avatar
флаг in
Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/126448/discussion-between-plumo-and-saeed-neamati).
vanadium avatar
флаг cn
Добавьте кавычки, чтобы он правильно обрабатывал пробелы (`"{}"`). Если количество файлов очень велико, аргумент может стать слишком длинным. Использование `\;` в конце вместо `+` предотвратит это, но станет медленнее: команда `rename` будет выполняться каждый раз снова для каждого отдельного файла. Однако вы можете обрабатывать неограниченное количество файлов.
pLumo avatar
флаг in
@vanadium --> `find` заботится о пробелах без кавычек вокруг `{}`. То же самое для максимальных аргументов `find -exec ... +` позаботится и отправит только столько аргументов, сколько возможно.
vanadium avatar
флаг cn
@pLumo, так что это довольно умно! Хорошо знать!
Рейтинг:2
флаг cn

Ты можешь сделать переименовать рекурсивный, если вы предпочитаете такой синтаксис:

шопт -с глобстар
переименовать 's/old/new/' **/*

Баша глобус вариант делает ** сопоставить 0 или более каталогов или файлов рекурсивно, поэтому **/* будет выполнять рекурсию по всему дереву каталогов. Вам просто нужно написать свой шаблон поиска в виде шара вместо регулярного выражения. Например, чтобы переименовать все файлы, имя которых содержит фу, вы бы сделали:

шопт -с глобстар
переименовать 's/old/new/' **/*foo*
Рейтинг:0
флаг cn

Вы должны быть в состоянии более или менее сохранить тот же формат, который был у вас с grep и sed, хотя я думаю, что вам все равно понадобится такой инструмент, как find, чтобы предоставить grep файлы для поиска.

Изменить: обновлено информацией из комментариев. спасибо @pLumo и @terdon за то, что они показали, что это не сработает для файлов с символами новой строки в имени.

найти /some/directory -print0 | grep -zE "search_regex" | переименовать -0 's/old/new/g'
pLumo avatar
флаг in
Вы должны использовать null в качестве разделителя, так как новая строка является допустимым символом для имени файла. Используйте: `find -print0`, `grep -z` и `rename -0`.
Saeed Neamati avatar
флаг cn
Теперь это чисто и незабываемо. Я проверил это, и это просто сработало. Не нужно ничего менять. Спасибо большое. `найти . | поиск | переименовать 's/old/new/g'`
terdon avatar
флаг cn
Это не удастся сделать для имен файлов, содержащих символы новой строки @SaeedNeamati и wizardpurple.

Ответить или комментировать

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