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

我必须做一个sed行(在Linux中也使用pipe道)来更改文件扩展名,所以我可以做一些mv *.1stextension *.2ndextensionmv *.txt *.c 。 问题是我不能使用批处理或for循环,所以我必须使用pipes和sed命令来完成所有操作。

你可以使用字符串操作

 filename="file.ext1" mv "${filename}" "${filename/%ext1/ext2}" 

或者如果你的系统支持,你可以使用rename

sed用于处理文件的内容,而不是文件名。 我的建议:

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

或者,有这个应该帮助的问题 。

您可以尝试以下选项

选项1随着rename

 find . -type f -name "*.ext1" -exec rename -f 's/\.ext1$/ext2/' {} \; 

选项2 findmv

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

注:据观察, rename不适用于许多终端

你可以使用find来查找所有的文件,然后将它们while readwhile read循环:

 $ find . -name "*.ext1" -print0 | while read -d $'\0' file do mv $file "${file%.*}.ext2" done 

${file%.*}右小模式过滤器%标记要从右侧删除的模式(与最小的glob模式匹配), .*是模式(最后一个.之后是后面的字符)。

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

另一个解决方案只能用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 

这可能工作:

 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