使用sed更改文件扩展名

如果参数是文件,我想把它们的扩展名改成.file

这就是我得到的:

 #!/bin/bash while [ $# -gt 0 ] do if [ -f $1 ] then sed -i -e "s/\(.*\)\(\.\)\(.*\)/\1\2file" $1 fi shift done 

该脚本正在运行,但它什么都不做。 另一个问题是该文件没有任何扩展名,我的sed命令将无法正常工作? 请帮忙。

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

选项1,取自John Smith的这个答案 :

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

选项2,取自chooban的这个答案 :

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

选项3,摘自David W.的这个答案 :

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

多在这里 。

更新:(在评论问什么%和{}做?)

“$ {variable} othter_chars”>如果你想在字符串中扩展一个变量,你可以使用它。 和%.* in {}表示将变量带的值从模式中取出.*例如,如果您的变量是filename.txt “$ {variable%。*}”返回filename

使用shell函数来封装一个sed evaluatee )命令:

 mvext () { ext="$1"; while shift && [ "$1" ]; do sed 's/.*/mv -iv "&" "&/ s/\(.*\)\.[^.]*$/\1/ s/.*/&\.'"${ext}"'"/e' <<< "$1"; done } 

测试,给文件b和 ,扩展名应为。文件,然后更改为.buzz

  mvext file bah boo mvext buzz b*.file 

输出:

 'bah' -> 'bah.file' 'boo' -> 'boo.file' 'bah.file' -> 'bah.buzz' 'boo.file' -> 'boo.buzz' 

怎么运行的:

  1. 第一个参数是文件扩展名,它存储在$ ext中
  2. while循环分别解析每个文件的名称,因为一个名字可能包含转义空格和什么。 如果文件名肯定没有这样的空格,那么可以避免使用while循环。
  3. sed读取标准输入, 这里是一个bash提供的字符串 <<< "$1"
  4. sed代码将字符串“ mv -iv foo.bar foo.file ”中的每个名称foo.bar (甚至只是普通的foo )都更改,然后使用e valuate命令运行该字符串。 -iv选项显示已经移动的内容,并提示现有文件是否可能被覆盖。