删除子目录中的扩展名
我需要删除扩展名“.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
请使用以下一些工具进行操作:
-
Sed并找到
-
ruby
-
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
,从基目录中find
和mv
。
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重命名器。