Множество способов снять шкуру с этой кошки. Если вы предпочитаете, чтобы ваш шаблон был регулярным выражением, а не файловым глобусом, и вы хотите сделать это рекурсивно, вы можете использовать что-то вроде этого:
find . -print | sed -ne '/^\.\/pattern1\(\..*\)/s//mv "&" "pattern2\1"/p'
Как Керрек предложил в своем ответе, этот сначала показывает вам, что он будет делать. Передайте вывод через оболочку (т.е. добавьте | sh
в конец), как только вы освоитесь с командами.
Это работает для меня:
[ghoti@pc ~]$ ls -l foo.*
-rw-r--r-- 1 ghoti wheel 0 Mar 26 13:59 foo.php
-rw-r--r-- 1 ghoti wheel 0 Mar 26 13:59 foo.txt
[ghoti@pc ~]$ find . -print | sed -ne '/^\.\/foo\(\..*\)/s//mv "&" "bar\1"/p'
mv "./foo.txt" "bar.txt"
mv "./foo.php" "bar.php"
[ghoti@pc ~]$ find . -print | sed -ne '/^\.\/foo\(\..*\)/s//mv "&" "bar\1"/p' | sh
[ghoti@pc ~]$ ls -l foo.* bar.*
ls: foo.*: No such file or directory
-rw-r--r-- 1 ghoti wheel 0 Mar 26 13:59 bar.php
-rw-r--r-- 1 ghoti wheel 0 Mar 26 13:59 bar.txt
[ghoti@pc ~]$