如果参数是文件,我想将其扩展名更改为.file
。使用sed更改文件扩展名
这就是我的了:
#!/bin/bash
while [ $# -gt 0 ]
do
if [ -f $1 ]
then
sed -i -e "s/\(.*\)\(\.\)\(.*\)/\1\2file" $1
fi
shift
done
脚本运行,但它不会做任何事情。另一个问题是该文件没有任何扩展名,我的sed命令不起作用,对吧?请帮忙。
如果参数是文件,我想将其扩展名更改为.file
。使用sed更改文件扩展名
这就是我的了:
#!/bin/bash
while [ $# -gt 0 ]
do
if [ -f $1 ]
then
sed -i -e "s/\(.*\)\(\.\)\(.*\)/\1\2file" $1
fi
shift
done
脚本运行,但它不会做任何事情。另一个问题是该文件没有任何扩展名,我的sed命令不起作用,对吧?请帮忙。
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
。
文件的扩展名没有给出。它可以是.txt或.file或任何东西。我希望脚本不关心这一点。 –
这并不是什么大不了的事,你可以在选项3中使用'“*。*”''''''''''''''''''''''来获得任何扩展名的文件名。 –
Ty,man。它正在工作。你能告诉我,请问%和{}做什么?这是我第一次使用它们。 –
使用壳功能包一个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'
工作原理:
while
循环会分别解析每个文件的名称,因为名称可能包含转义空格以及其他内容。如果文件名是某些没有这样的空格,那么可能会避免使用while
循环。sed
读取标准输入,由bash
这里提供字符串<<< "$1"
。sed
代码改变每个名称foo.bar(或者甚至只是简单FOO)为字符串 “MV -iv foo.bar foo.file” 然后运行与e
计价该字符串命令。 -iv
选项显示已被移动的内容,并提示是否可能覆盖现有文件。
如果有的话,sed是为了改变文件的内容,而不是它们的名字。你可以将它用于后者,但它不是最好的工具。你的sed命令并没有说sed应该采取什么行动,我认为你的脚本只是挂在那一行上,对吧? –
是的,当我问这个问题时,我在sed命令后忘了$ 1。但它无法正常工作。 –
是的,因为该命令会更改文件的*内容*,而不是它们的名称。 –