我根据我在此处找到的示例编写了一个小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
提前感谢您帮我纠正错误代码。
答案 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