在tcsh
中是否有单行命令来更改一组文件的扩展名?在各种DOS弹,我曾经使用下列内容:tcsh:如何更改多个文件的文件扩展名?
ren *.abc *.def
这将重命名.abc
结尾来结束,而不是.def
所有文件。在sed
条款这将执行类似以下内容:
sed -e 's/\(.\)*\.abc$/\1.def/'
上的文件名。我可能会把它们拼凑起来,在* nix中实现类似的效果,但我猜这里的问题是我缺少tcsh
的经验。
任何帮助表示赞赏。
在tcsh
中是否有单行命令来更改一组文件的扩展名?在各种DOS弹,我曾经使用下列内容:tcsh:如何更改多个文件的文件扩展名?
ren *.abc *.def
这将重命名.abc
结尾来结束,而不是.def
所有文件。在sed
条款这将执行类似以下内容:
sed -e 's/\(.\)*\.abc$/\1.def/'
上的文件名。我可能会把它们拼凑起来,在* nix中实现类似的效果,但我猜这里的问题是我缺少tcsh
的经验。
任何帮助表示赞赏。
[整理答案 - 什么提问者从响应了]:
有没有简单的方法来改变一组文件的名称tcsh中。查斯。提供了tcsh中最简单的解决方案,但它仍然不容易。
如果您使用tcsh作为您的shell使用外部重命名命令(请参阅Eddie的回答),那么执行后续操作的最佳方法是。
我明白,这不是我在问题中实际询问的 - 但我学到的是我的问题是错的!
感谢大家的回复,你的回答非常有帮助 - 每个人都有不同的方式。如果有人想以比我更好的方式总结这个问题的结果,请做。我更愿意把我的“接受的答案”给别人!
我不知道,如果tcsh
提供了一个更简单的方法来做到这一点,但这里是我最常做的:
ls *.abc | sed 's/\(.*\)\.abc/mv "\1.abc" "\1.def"/' | sh
我也写称为regexmv
一个Python脚本使用正则表达式重命名文件。这里的脚本:
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' *
键入这四行。第一次提示后,tcsh会告诉你,你在foreach
循环内。你也可以把它变成一个shell脚本并调用这个shell脚本。
foreach n (`ls *.abc`)
set base = `basename $n .abc`
mv $n $base.def
end
* nix世界中没有“扩展”的概念。 '点abc'只是文件名的一部分。有一个perl脚本来模仿here的行为。
我很抱歉,我不能提供tcsh的,但有一个bash成语:
for f in *.foo; do
mv $f ${f%foo}bar
done
除了其他人所说,许多UNIX系统提供了一个名为“rename
”命令。如果您的目标是使用tcsh
重命名文件,具体来说,那么这不会对您有所帮助。否则,您可以通过以下方式实现您的目标:
rename abc def *.abc
这是一个非常简单且非常有用的命令。在由第三个参数提供的文件列表中,它将第一个参数的所有出现替换为第二个参数。至少在我熟悉的版本中,根本没有模式匹配,除非你的shell会扩展第三个参数文件列表中的模式。
foreach f (*.abc)
mv $f $f:r.xyz
end