Shell - 更改文件名而不更改给定路径的扩展名

时间:2013-08-06 12:39:07

标签: linux bash shell

我正在编写一个脚本,我在迭代文件夹并重命名文件而不更改给定路径的扩展名。我正在使用find -for example

获取文件的路径
  

ABC / XYZ / qwe.txt

现在我接受用户的文件名,并希望重命名该文件,如

  

ABC / XYZ / myfile.txt的

可以解决这个问题。如何重命名文件?我试过下面的代码

find "$input_variable" -type f -name $word.* | while read file; do  mv $file | sed "s/$word/$replace/"; done;;

更新 试试这个

echo "Please Insert the path of the folder"
read input_variable

read -p "Enter the word to find = " word
read -p "Enter word to replace = " replace

find "$input_variable" -type f -name "$word.*" | while read file; 
do
    echo "$file"
    s="$file"
    d="`dirname $s`"
    f="`basename $s`"
    nf=$(echo $f | sed "s/^[^.]*\./$word./")
    newFileName="$d/$nf"
done

2 个答案:

答案 0 :(得分:1)

这可能是一种方式:

find "$input_variable" -type f -name "$word.*" | while read file; do
    dir=${file%/*}
    base=${file##*/}
    ext=${base##*.}
    noext=${base:0:${#base} - ${#ext} - 1}
    newname=${noext/"$word"/"$replace"}.$ext
    echo mv "$file" "$dir/$newname"
done

当您确定它已经正确时,删除回声部分。

编辑:

find "$input_variable" -type f -name "$word.*" | while read file; do
    dir=${file%/*}
    base=${file##*/}
    noext=${base%.*}
    ext=${base:${#noext}}
    newname=${noext/"$word"/"$replace"}$ext
    echo mv "$file" "$dir/$newname"
done

答案 1 :(得分:0)

再次更新它,因为OP似乎正在使用一些旧的shell:

使用dirnamebasename

s="abc/xyz/myfile.txt"
d="`dirname $s`"
f="`basename $s`"

mf="myfile"
nf=`echo $f | sed "s/^[^.]*\./$mf./"`
# merge the dir name and new file name
newFileName="$d/$nf"

<强>测试

$ echo "$newFileName"
abc/xyz/myfile.txt