Bash: переименовать небольшую часть нескольких файлов в середине имени - программирование
Подтвердить что ты не робот

Bash: переименовать небольшую часть нескольких файлов в середине имени

Я хотел бы изменить это

cc211_AMBER_13062012i.II  cc211_GROMOS_13062012i.II
cc211_CHARM_13062012i.II  cc211_OPLS_13062012i.II

к

cc211_AMBER_15062012i.II  cc211_GROMOS_15062012i.II
cc211_CHARM_15062012i.II  cc211_OPLS_15062012i.II

Я пробовал,

find -name "*.13 *" | xargs rename ".13" ".15"

Как правило, между 3-й и второй астерикса нет пробела, и это просто делает курсивом то, что я вижу. В основном есть много ответов о том, что делать, когда он находится в конце имени файла, где, похоже, работает asterix, но здесь я не могу заставить его работать.

Все, что у вас есть, облегчит мне жизнь!

Изменить 1: пробный

-bash-4.1$ ls

cc211_AMBER_13062012.II  cc211_GROMOS_13062012.II
cc211_CHARM_13062012.II  cc211_OPLS_13062012.II

-bash-4.1$ rename 's/_13/_15/' cc*
-bash-4.1$ ls

cc211_AMBER_13062012.II  cc211_GROMOS_13062012.II
cc211_CHARM_13062012.II  cc211_OPLS_13062012.II 

Спасибо,

Charlie

4b9b3361

Ответ 1

Как насчет этого:

for i in *.II; do mv $i $(echo $i | sed 's/_13/_15/g'); done

Это заменит _13 на _15 во всех файлах с расширением .II

Подробнее о sed здесь.

Ответ 2

Чистое решение bash:

for i in cc*; do
  mv "$i" "${i/_13/_15}"
done

Ответ 3

rename 's/_13/_15/' cc*

Должен делать то, что вы хотите. Регулярное выражение s/_13/_15/ заменяет _13 на _15 во всех файлах, начинающихся с 'cc'.

$ ls
cc211_AMBER_13062012.II  cc211_GROMOS_13062012.II
cc211_CHARM_13062012.II  cc211_OPLS_13062012.II

$ rename 's/_13/_15/' cc*

$ ls
cc211_AMBER_15062012.II  cc211_GROMOS_15062012.II
cc211_CHARM_15062012.II  cc211_OPLS_15062012.II

Это будет работать только с новой версией perl rename. Чтобы проверить, какая версия у вас есть, man rename. Если в верхней части страницы указано

Справочное руководство для программистов на Perl

у вас есть версия perl. Если он говорит:

Руководство для программистов Linux

у вас стандартная (более старая) версия.

Для старшей версии команда должна быть:

rename _13 _15 cc*

Ответ 4

Я использую чистое решение для Linux:

### find all files that contains _DES in name and duplicate them adding _AUXLOCAL
for f in **/*_DES*; do
    cp "$f" "${f%.DES}_AUXLOCAL"
done 
###Rename all _AUXLOCAL files, removing _DES to _LOCAL
for f in **/*_AUXLOCAL*; do
  mv "$f" "${f/_DES/_LOCAL}"
done
###Rename all _AUXLOCAL files, removing _AUXLOCAL
for f in **/*_AUXLOCAL*; do
  mv "$f" "${f/_AUXLOCAL/}"
done

Я надеюсь, что это поможет