Найти и заменить строку в списке имен файлов

2

У меня есть несколько файлов, таких как (в Mac OS X):

product-103-footer.tpl
product-103-header.tpl
product-103.tpl

Я хочу заменить «103» во всех именах файлов чем-то другим, используя grep и sed, или что-то подобное.

Как мне это сделать?

Вот некоторая псевдо-командная строка того, чего я хочу достичь

find . /[103] | grep 103 | sed s/103/104/

Надеюсь, что это имеет смысл!

РЕДАКТИРОВАТЬ:

Все ближе:

find . -name 'product-103*' -print | sed 's/103/104/g'
josef.van.niekerk
источник
Я могу заменить строку, используя sed: echo 'product-103' | sed 's / 103/104 / g', но нужно зациклить каждый файл и переименовать их по отдельности.
josef.van.niekerk

Ответы:

9

Ты можешь использовать find «s exec возможность (рекурсивно) перебрать все файлы, а затем использовать простые замены строк:

find . -type f -name "product-103*" \
-exec sh -c 'echo mv "$0" "${0/103/104}"' '{}' \;

Удалить echo когда вы уверены, что это делает то, что вы хотите.

В основном, что exec делает это заменить имя файла каждого файла, найденного в {}, который передается в качестве аргумента sh -c, Этот аргумент доступен как $0Таким образом, имя файла. Мы используем это $0 аргумент в mv вызов, где вторым аргументом является новое имя файла. Здесь 103 заменяется на 104. Обратите внимание, что двойные кавычки необходимы для правильной обработки пробелов в именах файлов.

Увидеть Манипуляция строк в Bash Scripting Guide.


С зш zmv (на OS X через /bin/zsh ):

autoload -U zmv
zmv -Wn '*103*' '*104*'

Удалить -n вариант, когда это делает то, что вам нужно.

slhck
источник
2

Perl лучше для этого.

find . -name 'product-103*' | perl -nle '($new=$_) =~ s/103/104/;rename $_,$new'

Следующий кусок кода

perl -nle '($new=$_) =~ s/103/104/;rename $_,$new'

в конечном итоге будет расширен до

while (<>) {
    chomp;
    ($new=$_) =~ s/103/104/;
    rename $_, $new;
}

<> оператор получит каждое имя файла с символом '\ n' в конце и сохранит его в $ _, затем chomp отрубит '\ n'. Тогда переменная $new получает старое имя файла от $_ и заменить 103 на 104. Наконец, rename просто переименуйте файл в его новое имя. Для получения более подробной информации о ключе -n -l -e, обратитесь к PerlRun часть perldoc.

ltux
источник