我必须做一个 sed 行(也在 Linux 中使用管道)来更改文件扩展名,所以我可以做一些mv *.1stextension *.2ndextension类似mv *.txt *.c. 问题是我不能使用批处理或 for 循环,所以我必须使用管道和 sed 命令来完成这一切。
			
			19667 次
		
7 回答
            11        
        
		
你可以使用字符串操作
filename="file.ext1"
mv "${filename}" "${filename/%ext1/ext2}"
或者,如果您的系统支持,您可以使用rename.
更新
你也可以做这样的事情
mv ${filename}{ext1,ext2}
这称为大括号扩展
于 2013-10-03T17:07:08.733   回答
    
    
            5        
        
		
于 2013-10-03T17:54:38.130   回答
    
    
            4        
        
		
这可能有效:
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
    于 2013-10-03T17:16:40.763   回答
    
    
            3        
        
		
您可以使用它find来查找所有文件,然后将其通过管道传输到一个while read循环中:
$ find . -name "*.ext1" -print0 | while read -d $'\0' file
do
   mv $file "${file%.*}.ext2"
done
${file%.*}是小右模式过滤器。%标记要从右侧删除的模式(匹配可能的最小 glob 模式),The是.*模式(最后一个.后面是 后面的字符.)。
将使用字符而不是.-print0分隔文件名。将读入由字符分隔的文件名。这样,带有空格、制表符、或其他古怪字符的文件名将被正确处理。NUL\n-d $'\0'NUL\n
于 2013-10-03T17:23:52.930   回答
    
    
            2        
        
		
仅使用 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
    于 2013-10-03T19:40:44.537   回答
    
    
            2        
        
		
您可以尝试以下选项
选项 1 find以及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不适用于许多终端
于 2013-10-03T17:46:28.243   回答
    
    
            0        
        
		
好吧,这应该可以
mv $file $(echo $file | sed -E -e 's/.xml.bak.*/.xml/g' | sed -E -e 's/.\///g')
输出
abc.xml.bak.foobar -> abc.xml
    于 2021-08-02T10:22:04.637   回答