删除子目录中的扩展名

我需要删除扩展名“.tex”:

./1-aoeeu/1.tex ./2-thst/2.tex ./3-oeu/3.tex ./4-uoueou/4.tex ./5-aaa/5.tex ./6-oeua/6.tex ./7-oue/7.tex 

请使用以下一些工具进行操作:

  1. Sed并找到

  2. ruby

  3. python

我的可怜尝试:

 $find . -maxdepth 2 -name "*.tex" -ok mv `sed 's@.tex@@g' {}` {} + 

用于执行相同操作的Python脚本:

 import os.path, shutil def remove_ext(arg, dirname, fnames): argfiles = (os.path.join(dirname, f) for f in fnames if f.endswith(arg)) for f in argfiles: shutil.move(f, f[:-len(arg)]) os.path.walk('/some/path', remove_ext, '.tex') 

一种方式,不一定是最快的(但至少是最快的):

     pax> for i in * .c * / * .c * / * / * .c; 做
     ...> j = $(echo“$ i”| sed's / \ .c $ //')
     ...> echo mv“$ i”“$ j”
     ...>完成

它是等效的,因为你的maxdepth是2.脚本只是回显mv命令(用于测试目的)和处理C文件(因为我没有要测试的tex文件)。

或者,您可以使用find及其所有function:

     pax>找到。  -maxdepth 2 -name'* .tex'| 读线; 做
     ...> j = $(echo“$ line”| sed's / \。tex $ //')
     ...> mv“$ line”“$ j”
     ...>完成

使用“for i in”可能会导致“参数太多”错误

更好的方法是将查找管道传输到下一个进程。

例:

 find . -type f -name "*.tex" | while read file do mv $file ${file%%tex}g done 

(注意:不处理带空格的文件)

使用bash ,从基目录中findmv

  for i in $(find . -type f -maxdepth 2 -name "*.tex"); do mv $i $(echo "$i" | sed 's|.tex$||'); done 

变体2基于此处的其他答案。

 find . -type f -maxdepth 2 -name "*.tex" | while read line; do mv "$line" "${line%%.tex}"; done 

PS:我没有得到关于逃避的部分. ‘by pax

有一个出色的Perl重命名脚本,附带一些发行版,否则你可以在网上找到它。 (我不确定它在哪里正式,但就是这样 )。 检查您的重命名是否由Larry Wall撰写( man rename AUTHOR部分)。 它会让你做类似的事情:

 find . [-maxdepth 2] -name "*.tex" -exec rename 's/\.tex//' '{}' \; 

在这里使用-exec是最简单的,因为只有一个动作要执行,并且多次调用重命名并不太昂贵。 如果您需要做多件事,请使用“while read”表单:

 find . [-maxdepth 2] -name "*.tex" | while read texfile; do rename 's/\.tex//' $texfile; done 

如果您有想要仅调用一次的内容:

 find . [-maxdepth 2] -name "*.tex" | xargs rename 's/\.tex//' 

最后一个清楚地说明了重命名是多么有用 – 如果一切都在同一个地方,你就有了一个快速的regexp重命名器。