我需要删除扩展名“.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. 红宝石

  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 ; do
    ...> j=$(echo "$i" | sed 's/\.c$//')
    ...> echo mv "$i" "$j"
    ...> done

这是等价的,因为你的最大深度是 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

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

更好的方法是将 find 传递到下一个进程。

例子:

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

附:我没有得到关于逃跑的部分'.' 经过 pax...

某些发行版附带了一个出色的 Perl 重命名脚本,您也可以在网络上找到它。(我不确定它的正式位置,但是 就是这个)。检查您的重命名是否由拉里·沃尔(Larry Wall)撰写(作者部分) man rename)。它会让你做类似的事情:

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

此处使用 -exec 是最简单的,因为只需执行一项操作,并且多次调用 rename 的成本也不会太高。如果您需要执行多项操作,请使用“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//'

最后一个清楚地表明了重命名是多么有用 - 如果所有内容都已经在同一个位置,那么您就拥有了一个快速的正则表达式重命名器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top