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