Пакетное переименование файлов в папке

10

Как я могу удалить какой-то текст из имен файлов в папке?

В настоящее время я пытаюсь:

rename s/"NEWER_(.*?)"//g *

Но ничего переименовывать

У меня есть родительская папка с кучей подпапок, внутри которых находятся файлы, которые, по мнению OneDrive, было бы отличной идеей добавить к «(NEWER_timestamp)», и я хотел бы удалить это.

Примеры имен файлов:

getyou.ico (NEWER_1417529079.87)
o7pm.ico (NEWER_1417529184.89)
o7th.ico (NEWER_1417529135.81)
Kevin
источник
2
Можете ли вы опубликовать пример имени файла?
Муру
конечно. обновленный вопрос с некоторыми
Кевин

Ответы:

8

Попробуйте следующее:

find /path/to/parrent-dir -type f -exec rename -n 's:[^/]*(.*) .*$:$1:' {} +

./o7th.ico (NEWER_1417529135.81)                                 renamed as /o7th.ico
./sub-dir (NEWER_1417529135.81)/getyou.ico (NEWER_1417529079.87) renamed as /sub-dir (NEWER_1417529135.81)/getyou.ico
./sub-dir (NEWER_1417529135.81)/o7pm.ico (NEWER_1417529184.89)   renamed as /sub-dir (NEWER_1417529135.81)/o7pm.ico
./getyou.ico (NEWER_1417529079.87)                               renamed as /getyou.ico
./o7pm.ico (NEWER_1417529184.89)                                 renamed as /o7pm.ico
  • Все [^/]*(.*) .*$соответствует только последней части пути, которая не содержит /. И
  • В приведенном выше регулярном выражении (.*)это группа соответствия всего после последнего /и перед пробелом . Его обратная ссылка будет $1.
  • .*$соответствует всему концу $имени файла после пробела.
  • Наконец, в замещающей части переименования s/.../REPLACEMENT/мы просто сохранили группу соответствия между последней \и пробелом, (.*)который называется группой совпадений.
αғsнιη
источник
2

Вы должны рассмотреть возможность использования кавычек за пределами регулярного выражения (внутри они воспринимаются буквально как кавычки) и escape (. Пытаться;

rename -n 's/ \(NEWER_\d{10}.\d{2}\)$//' *NEWER*

Точность выражения может не требоваться, но вы не можете быть слишком осторожны при изменении файлов.

Мур
источник
все, что он делает, зависает со reading filenames from STDINмной, я уже нахожусь в папке «Родитель», где все эти файлы
Кевин
@Kevin «Если в командной строке не указано ни одного имени файла, оно будет прочитано через стандартный ввод». А поскольку оболочка *NEWER*остается такой, какой она есть, если не найдено никаких расширений, вы, должно быть, допустили ошибку или используете оболочку, которая заменяет непревзойденный подстановочный знак ничем.
Муру
скопировал и вставил в оболочку Ubuntu 14.10
Кевин