删除子目录中的扩展名

时间:2009-07-30 05:31:04

标签: python ruby sed find

我需要删除扩展程序“.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

  4. 我的差劲尝试:

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

5 个答案:

答案 0 :(得分:4)

执行相同操作的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')

答案 1 :(得分:1)

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

    pax> for i in *.c */*.c */*/*.c ; do
    ...> j=$(echo "$i" | sed 's/\.c$//')
    ...> echo mv "$i" "$j"
    ...> done

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

或者,你可以使用find及其所有权力:

    pax> find . -maxdepth 2 -name '*.tex' | while read line ; do
    ...> j=$(echo "$line" | sed 's/\.tex$//')
    ...> mv "$line" "$j"
    ...> done

答案 2 :(得分:0)

使用基本目录中的bashfindmv

 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:我没有得到关于通过.逃避'pax'的部分......

答案 3 :(得分:0)

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

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

示例:

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

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

答案 4 :(得分:0)

有一个出色的Perl重命名脚本,附带一些发行版,否则你可以在网上找到它。 (我不确定它在哪里正式,但是this is it)。检查您的重命名是否由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 renamer。