Помогите с этим .sh кодом - PullRequest
0 голосов
/ 22 марта 2011

Я пытаюсь создать скрипт оболочки, который изменит расширение файла, когда вы наберете что-то вроде этого в терминале:

extcha xx yy * .xx

Это кодЯ произвел

#!/bin/sh

while [ *.$1 ] ; do

    export name=`basename $i .$1`
    echo mv $name.$1 $name.$2

done;

Это не похоже на работу.Может кто-нибудь сказать мне, где я иду не так?

Ответы [ 3 ]

2 голосов
/ 23 марта 2011

Вот что вы хотите сделать:

for name in *.$1; do
    stripped_name="$(basename "$name" ".$1")"
    mv "$name.$1" "$name.$2"
done

Ваш большой недостаток в том, что цикл while просто оценивает это условие, эффективно проверяя наличие файлов с именами этой формы. Он не хранит ничего в любой переменной - конечно, не что-то произвольное, как $i. Вам также не нужно ничего экспортировать здесь. Это просто делает его видимым для дочерних процессов, которые вам не нужны.

Конечно, вы могли бы просто использовать утилиту переименования. С основным (редхат и друзья):

# Note that this will actually rename abc.foo.foo to abc.bar.foo
# since it replaces the first match.
rename .foo .bar *.foo

и с причудливым perl one (debian / ubuntu):

rename 's/.foo$/bar/' *.foo
0 голосов
/ 23 марта 2011

Изменить на:

for i in  *.$1 ; do


    name=`basename $i .$1`
    mv $name.$1 $name.$2

done

Не забудьте добавить проверку ошибок (например, есть два аргумента)

0 голосов
/ 22 марта 2011

Вы можете просто использовать утилиту rename ... Она делает это.

РЕДАКТИРОВАТЬ: сценарий.

#!/bin/bash

from="$1"
shift
to="$1"
shift

IFS="
"
for f in $@
do
  basefile="`basename "$f" ".$from"`"
  if [ ! "$basefile" = "$f" ]
  then
    echo mv "$basefile.$from" "$basefile.$to"
  fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...