用于重命名文件的Shell脚本

时间:2010-08-30 01:41:28

标签: linux shell file while-loop

我根据我在此处找到的示例编写了一个小shell脚本:https://bbs.archlinux.org/viewtopic.php?id=36305

需要这个:

bash-3.2$ ls
test 001  test 002  test 003  test 004

并将其变为:

bash-3.2$ ls
001  002  003  004  rename.sh

然而它给了我这个错误(即使它有效):

bash-3.2$ ./rename.sh
mv: missing destination file operand after `rename.sh'
Try `mv --help' for more information.
`test 001' -> `001'
`test 002' -> `002'
`test 003' -> `003'
`test 004' -> `004'

虽然它可以正常工作,但很高兴看到我搞砸了,我默认它会将文件放在同一个目录中(这是所需的输出)。

#!/bin/bash
ls | while read -r FILE
do
        mv -v "$FILE" `echo $FILE | awk -F ' ' '{print $2}'`
done

提前感谢您帮我纠正错误代码。

3 个答案:

答案 0 :(得分:1)

为什么使用ls进行while循环的额外进程?只需使用带有shell扩展的for循环。这是首选方式

#!/bin/bash
shopt -s nullglob
for file in *
do
  if [ -f "$file" ];then
    newfile="${file##* }"
    mv "$file" $newfile"
  fi
done

答案 1 :(得分:0)

邮差几乎拥有它。对于rename.sh,awk命令不返回任何内容,所以实际上你有shell尝试执行的以下命令:

mv rename.sh

因此错误消息“缺少目标文件”

您可以通过测试脚本的文件名(硬编码或$ 0)来解决此问题,并仅在$ FILE与脚本名称相同时执行mv命令。

答案 2 :(得分:0)

我确实喜欢这样,它可以完美地更改文件名。您可以尝试如下操作。

mkdir /root/test; touch my\ file{1..10}

vim rename.sh

#!/bin/bash
ls /root/test| while read -r FILE
do
  mv -v /root/test/"$FILE" /root/test/`echo $FILE | awk -F" " '{print $2}'`
done

 chmod +x rename.sh
./rename.sh