我必须做一个sed行(在Linux中也使用pipe道)来更改文件扩展名,所以我可以做一些mv *.1stextension *.2ndextension
如mv *.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 find
与mv
find . -type f -name "*.ext1" -exec sh -c 'mv -f $0 ${0%.ext1}.ext2' {} \;
注:据观察, rename
不适用于许多终端
你可以使用find
来查找所有的文件,然后将它们while read
入while 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