Linux 如何使用sed更改文件扩展名?

Linux 如何使用sed更改文件扩展名?,linux,bash,sed,Linux,Bash,Sed,我必须使用sed行(在Linux中也使用管道)来更改文件扩展名,这样我就可以执行某种mv*.1textension*.2ndextension,比如mv*.txt*.c。问题是我不能使用批处理或for循环,所以我必须使用pipes和sed命令来完成这一切。您可以使用字符串操作 filename="file.ext1" mv "${filename}" "${filename/%ext1/ext2}" 或者,如果您的系统支持,您可以使用重命名 更新 你也可以这样做 mv ${filename}{

我必须使用sed行(在Linux中也使用管道)来更改文件扩展名,这样我就可以执行某种
mv*.1textension*.2ndextension
,比如
mv*.txt*.c
。问题是我不能使用批处理或for循环,所以我必须使用pipes和sed命令来完成这一切。

您可以使用字符串操作

filename="file.ext1"
mv "${filename}" "${filename/%ext1/ext2}"
或者,如果您的系统支持,您可以使用
重命名

更新

你也可以这样做

mv ${filename}{ext1,ext2}
这被称为支架扩展

这可能会起作用:

find . -name "*.txt" | 
sed -e 's|./||g' | 
awk '{print "mv",$1, $1"c"}' | 
sed -e "s|\.txtc|\.c|g" > table;
chmod u+x table;
./table
我不知道为什么你不能使用循环。它让生活变得更加轻松:

newex="c";  # Give your new extension
for file in *.*;  # You can replace with *.txt instead of *.*
do 
 ex="${file##*.}";    # This retrieves the file extension
 ne=$(echo "$file" | sed -e "s|$ex|$newex|g"); # Replaces current with the new one
 echo "$ex";echo "$ne";
 mv "$file" "$ne";
done

您可以使用
find
查找所有文件,然后在读取
循环时将其导入

$ find . -name "*.ext1" -print0 | while read -d $'\0' file
do
   mv $file "${file%.*}.ext2"
done
${file%.*}
是右边的小模式过滤器。
%
标记要从右侧移除的图案(匹配可能的最小全局图案),
*
是图案(最后一个
后跟
后面的字符)


-print0
将用
NUL
字符而不是
\n
分隔文件名。
-d$'\0'
将读取由
NUL
字符分隔的文件名。这样,将正确处理带有空格、制表符、
\n
或其他古怪字符的文件名。

您可以尝试以下选项

选项1
查找
以及
重命名

find . -type f -name "*.ext1" -exec rename -f 's/\.ext1$/ext2/' {} \;
选项2
查找
以及
mv

find . -type f -name "*.ext1" -exec sh -c 'mv -f $0 ${0%.ext1}.ext2' {} \;

注意:据观察,
重命名
对许多终端不起作用

sed用于操作文件内容,而不是文件名本身。我的建议是:

rename 's/\.ext/\.newext/' ./*.ext

或者,这应该会有所帮助。

另一种解决方案只使用sed和sh

printf "%s\n" *.ext1 | 
sed "s/'/'\\\\''/g"';s/\(.*\)'ext1'/mv '\''\1'ext1\'' '\''\1'ext2\''/g' | 
sh
为了获得更好的性能:只创建一个进程

perl -le '($e,$f)=@ARGV;map{$o=$_;s/$e$/$f/;rename$o,$_}<*.$e>' ext2 ext3
perl-le'($e,$f)=@ARGV;映射{$o=$\$s/$e$/$f/;重命名$o,$\}'ext2ext3

我想知道是否允许我们使用
重命名
…它在大多数Linux系统中都可用谢谢,但我不能使用任何批处理或脚本语句,我只能使用我的命令行、sed和管道。您的输入是什么?你期望什么样的产出?如果只允许
sed
的话,我认为您不能重命名文件。@user2113403:
用于*.1stextension中的文件名;执行mv“${filename}”“${filename/%1stextension/2ndextension}”;完成
可以处理一堆文件。不需要
sed
.POSIX:
${filename%.ext1}.ext2
我不应该使用任何循环或句子,只使用管道、命令行和sed这不是循环吗?OP不想要任何循环!这是一根管子。正如OP所说,“所以我必须用管道和sed命令来完成这一切”。我不确定OP在
for
方面有什么问题,但是
for
可能会很麻烦,因为它解析循环参数的方式。不幸的是,OP没有提供他们正在做什么的很多信息。有了更多的信息,我可以给出一个更好的答案。同意你的观点,OP没有提供足够的信息,为什么不循环!为什么不能使用循环?你应该说清楚!你这样做是作为家庭作业的一部分吗?我当然是,我没有提到,但我认为这是因为太有名了restrictions@iamauser如果
rename
不起作用,请尝试使用选项2
mv
。甚至我也不知道为什么
rename
对许多终端都不起作用。对我来说,它可以在
ubuntu
中工作,但不能在
RHEL
中工作,我必须在一个Makefile中用.o替换.c。这解决了我的问题,谢谢。