tcsh: Как изменить расширение файла для нескольких файлов? - PullRequest
1 голос
/ 12 апреля 2009

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

ren *.abc *.def

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

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

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

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

Ответы [ 6 ]

7 голосов
/ 12 апреля 2009

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

foreach n ( `ls *.abc` )
set base = `basename $n .abc`
mv $n $base.def
end
4 голосов
/ 12 апреля 2009

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

rename abc def *.abc

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

2 голосов
/ 12 апреля 2009

Я не знаю, если 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' *
1 голос
/ 01 марта 2018
foreach f (*.abc)
mv $f $f:r.xyz
end
0 голосов
/ 16 апреля 2009

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

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

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

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

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

0 голосов
/ 12 апреля 2009

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

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

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