измените * .foo на * .bar в unix однострочном - PullRequest
4 голосов
/ 19 августа 2011

Я пытаюсь преобразовать все файлы в данном каталоге с суффиксом ".foo" в файлы, содержащие такое же базовое имя, но с суффиксом, измененным на ".bar". Я могу сделать это с помощью сценария оболочки и цикла for, но я хочу написать однострочник, который достигнет той же цели.

Цель:
Ввод: * .foo
Выход: * .bar

Вот что я пробовал:

find . -name "*.foo" | xargs -I {} mv {} `basename {} ".foo"`.bar

Это близко, но неверно. Результаты:
Ввод: * .foo
Вывод: * .foo.bar

Есть идеи, почему данный суффикс не распознается по базовому имени? Кавычки вокруг ".foo" не являются обязательными, и результаты такие же, если они опущены.

Ответы [ 6 ]

4 голосов
/ 19 августа 2011

Хотя basename может работать с расширениями файлов, использовать функции расширения параметров оболочки проще:

for file in *.foo; do mv "$file" "${file%.foo}.bar"; done

Ваш код с basename не работает, потому что basename запускается только один раз, а затем xargs просто видит {}.bar каждый раз.

2 голосов
/ 19 августа 2011

для файла в * .foo;do mv $ file echo $file | sed 's/\(.*\.\)foo/\1bar/';сделано

Пример:

$ ls
1.foo  2.foo
$ for file in *.foo ; do mv $file `echo $file | sed 's/\(.*\.\)foo/\1bar/'` ; done
$ ls
1.bar  2.bar
$ 
1 голос
/ 19 августа 2011
$ for f in *.foo; do echo mv $f ${f%foo}bar; done
mv a.foo a.bar
mv b.foo b.bar

Удалите echo, когда будете готовы.

1 голос
/ 19 августа 2011

для х в $ (найти. -Name "* .foo"); do mv $ x $ {x %% foo} bar; сделано

0 голосов
/ 07 октября 2014

Почему бы вам не использовать "переименование" вместо скриптов или циклов.

RHEL: rename foo bar .*foo

Debian: rename 's/foo/bar/' *.foo

0 голосов
/ 19 августа 2011

Если вы установили mmv, вы можете сделать

mmv \*.foo \#1.bar

.

...