mv命令在命令行上单独工作,但不能通过脚本工作

use*_*017 1 unix bash shell sh

我有一个包含文件名的fodler,其中包含空格.

我创建了一个替换空格的脚本,并使用_而不是""(空格)创建新文件名,并在for循环中运行mv命令.

这在脚本中没有用,并给我以下消息.

   Usage: mv [-I] [ -d | -e] [-i | -f] [-E{force|ignore|warn}] [--] src target
   or: mv [-I] [-d | -e] [-i | -f] [-E{force|ignore|warn}] [--] src1 ... srcN directory
Run Code Online (Sandbox Code Playgroud)

但是如果我调试shell脚本并单独提取mv命令并运行它,它确实可以正常工作而没有任何问题.

生成的命令看起来像

   mv "abc  ddd eee.txt" abc_ddd_eee.txt
Run Code Online (Sandbox Code Playgroud)

你能否告诉我为什么在unix盒子上输入的命令工作正常而不是通过脚本?

整个脚本:

     for i in * 
      do 
       v1=$(echo $i|sed -e 's/^/"/g' -e 's/$/"/g' )
       v2=$(echo $v1|sed 's/ /_/g'|
             awk -F "[-.]" '{print $2,"_",$1,".",$3}'|
             sed 's/ //g'|
             sed -e 's/^_//g' -e 's/"$//g'|
             sed 's/"//2' )        
       mv $v1 $v2

      done
Run Code Online (Sandbox Code Playgroud)

Cha*_*ffy 5

在本机bash中,除了mv自身之外没有其他外部工具:

for i in *; do
    # change all spaces to underscores
    v2=${i// /_}

    # split into pieces on . and _ characters, and reassemble after 
    IFS='._' read -r first second rest <<<"$v2" && {
      v2="${second}_${first}.${rest}"
    }

    # remove any leading underscore
    v2=${v2#_}

    # rename
    mv -- "$i" "$v2"
done
Run Code Online (Sandbox Code Playgroud)

这是远远大于建立一个新的管道的运行更加高效sed,并awk为处理每个文件名一次.