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 предоставляют команду под названием "rename
Msgstr "Если ваша цель - переименовать файлы, используя 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' *
В мире *nix не было понятия "расширение". Точка abc - это только часть имени файла. Здесь есть Perl-скрипт для имитации поведения.
Извините, я не могу предоставить tcsh, но есть идиома bash:
for f in *.foo; do
mv $f ${f%foo}bar
done