Рекурсивно изменить имя файла в папке и подпапках без изменения пути к файлу - PullRequest
1 голос
/ 23 января 2020

У меня есть файлы в формате, подобном 639486572_016b0f3d-9ec3-4ad1-84ae-c98b68390322.wav. Файлы находятся в формате папки и подпапки, который напоминает дату. ./2019/05/31/639486572_016b0f3d-9ec3-4ad1-84ae-c98b68390322.wav.

Цель состоит в том, чтобы удалить все до и включая _. Что я могу сделать с rename -v 's/$\.+_//'

Но когда я пытаюсь связать это с find, кажется, что все файлы, найденные в подпапке, переименовываются правильно, но помещает \ перемещает их в root папка, из которой я работаю, в этом случае ./2019

Команда, которую я выполняю: find -type f -name "*_*" | rename -v 's/$\.+_//'

Как я могу убедиться, что расположение файлов не меняется?

1 Ответ

0 голосов
/ 23 января 2020

$\ будет неопределенным и ничего не изменит в вашем регулярном выражении.

.+_ будет соответствовать всему, начиная от начала строки до последнего символа _, включая информацию о пути. Вы захотите использовать более ограничительное выражение, которое не будет охватывать весь путь.

Есть несколько способов сделать это:

s![^/]+_!!        greedy match of consecutive non-/ chars

s!(.+/)?.+_!$1!   capture path and include it in the replacement

Существует также решение, которое будет использовать отрицательное утверждение, когда вы готовы открыть эту банку с червями.

...