2017-06-18 204 views
2

如果参数是文件,我想将其扩展名更改为.file使用sed更改文件扩展名

这就是我的了:

#!/bin/bash 

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

    fi 
    shift 
done 

脚本运行,但它不会做任何事情。另一个问题是该文件没有任何扩展名,我的sed命令不起作用,对吧?请帮忙。

+0

如果有的话,sed是为了改变文件的内容,而不是它们的名字。你可以将它用于后者,但它不是最好的工具。你的sed命令并没有说sed应该采取什么行动,我认为你的脚本只是挂在那一行上,对吧? –

+0

是的,当我问这个问题时,我在sed命令后忘了$ 1。但它无法正常工作。 –

+0

是的,因为该命令会更改文件的*内容*,而不是它们的名称。 –

回答

2

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

选项1,从this answer by John Smith采取:

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

选项2,从this answer by chooban采取:

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

选项3,从this answer by David W.采取:

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

,更是here

UPDATE:(在评论问%和{}做?)

“$ {}变量othter_chars”>如果你想扩大在字符串的变量,你可以使用它。和%.*{}装置从例如值的尾部取可变带的值off图案.*如果变量是filename.txt“$ {变量%。*}只返回filename

+0

文件的扩展名没有给出。它可以是.txt或.file或任何东西。我希望脚本不关心这一点。 –

+0

这并不是什么大不了的事,你可以在选项3中使用'“*。*”''''''''''''''''''''''来获得任何扩展名的文件名。 –

+0

Ty,man。它正在工作。你能告诉我,请问%和{}做什么?这是我第一次使用它们。 –

0

使用壳功能包一个sed评估e)命令:

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

测试,给出文件嘘声,和扩展应该是.file,然后将其改为.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代码改变每个名称foo.bar(或者甚至只是简单FOO)为字符串 “MV -iv foo.bar foo.file” 然后运行与e计价该字符串命令。 -iv选项显示已被移动的内容,并提示是否可能覆盖现有文件。