tcsh: Как изменить расширение файла для нескольких файлов?

Есть ли однострочная команда в tcsh изменить расширение набора файлов? В различных оболочках DOS я использовал следующее:

ren *.abc *.def

Это переименует все файлы, заканчивающиеся на .abc вместо этого закончить .def, В sed Условия это будет выполнять что-то вроде следующего:

sed -e 's/\(.\)*\.abc$/\1.def/'

на имена файлов. Я мог бы, вероятно, собрать кусочки воедино, чтобы добиться чего-то похожего в *nix, но я предполагаю, что проблема здесь в том, что у меня нет опыта работы с tcsh,

Любая помощь приветствуется.

6 ответов

Решение

[Подборка ответов - что спрашивающий получил из ответов]:

В tcsh нет простого способа изменить группу имен файлов. Чес. предоставил простейшее решение в tcsh, но все равно было нелегко.

Лучший способ сделать то, что мне нужно, если вы используете tcsh в качестве оболочки, это использовать команду внешнего переименования (см. Ответ Эдди).

Я ценю, что это не то, что я на самом деле задал в вопросе, но я узнал, что мой вопрос был неправильным!

Спасибо всем, кто ответил, ваши ответы были очень полезны - каждый по-своему. Если кто-то хотел бы суммировать результаты этого вопроса лучше, чем я, пожалуйста, сделайте это. Я бы предпочел дать свой "принятый ответ" кому-то еще!

Введите эти четыре строки. После первого запроса tcsh сообщит вам, что вы находитесь внутри foreach петля. Вы также можете превратить его в сценарий оболочки и вызвать этот сценарий оболочки.

foreach n ( `ls *.abc` )
set base = `basename $n .abc`
mv $n $base.def
end

В дополнение к тому, что говорили другие, многие разновидности UNIX предоставляют команду под названием "renameMsgstr "Если ваша цель - переименовать файлы, используя tcshв частности, тогда это вам не поможет. В противном случае вы можете достичь своей цели с помощью:

rename abc def *.abc

Это очень простая и очень полезная команда. В списке файлов, предоставленном 3-м аргументом, он заменяет все вхождения 1-го аргумента вторым. По крайней мере, в версиях, с которыми я знаком, сопоставление с образцом вообще отсутствует, за исключением того, что ваша оболочка будет расширять шаблоны в списке файлов для 3-го аргумента.

Я не знаю, если tcsh предоставляет более простой способ сделать это, но вот что я обычно делаю:

ls *.abc | sed 's/\(.*\)\.abc/mv "\1.abc" "\1.def"/' | sh

Я также написал сценарий Python под названием regexmv который переименовывает файлы, используя регулярные выражения. Вот сценарий:

import os
import re
import sys
import os.path

def main(argv):
    dry_run = True
    if argv[0] == '-f':
        dry_run = False
        argv = argv[1:]

    pattern = argv[0]
    repl    = argv[1]
    files   = argv[2:]

    max_length = max([len(f) for f in files])

    for f in files:
        new = re.sub(pattern, repl, f)
        if f != new:
            if not os.path.exists(new):
                print "%s --> %s" % (f.ljust(max_length), new)
                if not dry_run:
                    os.rename(f, new)

if __name__ == '__main__':
    main(sys.argv[1:])

Сначала я запускаю это так:

regexmv '\.abc$' '.def' *

чтобы увидеть, какие файлы будут переименованы (и как они будут переименованы), и если это то, что я хочу, я запускаю его так:

regexmv -f '\.abc$' '.def' *
foreach f (*.abc)
mv $f $f:r.xyz
end

В мире *nix не было понятия "расширение". Точка abc - это только часть имени файла. Здесь есть Perl-скрипт для имитации поведения.

Извините, я не могу предоставить tcsh, но есть идиома bash:

for f in *.foo; do
    mv $f ${f%foo}bar
done
Другие вопросы по тегам