我有以下代码,它应该将当前工作目录中的所有文件重命名为" basenameCOUNTextension",作为命令行参数给出。
base=$1
ext=$2
c=1
for file in *
do
if [ c > 100 ]; then
mid=$(printf "%03d" $c)
elif [ c > 10 ]; then
mid=$(printf "%03d" $c)
else
mid=$(printf "%03d" $c)
fi
if [ -e ./"$file$mid$ext" ]
then
continue
fi
mv "$file" "$base$mid$ext"
((c++))
done
这是成功运行此脚本后目录中内容的示例:
$ renumber 25thAnniversary jpeg
then the resulting files should have names like:
25thAnniversary001.jpeg, 25thAnniversary002.jpeg, 25thAnniversary003.jpeg, etc.
处理" 001"," 939"等是我的问题。我不确定printf是走的路还是一些条件。
这是我的编译错误:
renumber.sh: line 12: =c: command not found
mv: cannot move â(FILEPATH)â to ââ: No such file or directory
我的问题是什么?第12行对我来说似乎不是语法错误,我不理解mv错误。
答案 0 :(得分:4)
=
左侧未使用美元符号在bash中分配变量。
美元符号表示在评估命令之前用该变量的值替换变量。因此,如果$mid
还没有值,则$mid="c"
变为=c
,它没有有效的内置含义,因此bash会查找名为=c
的可执行文件$PATH
,以及无法找到的错误。
另一方面,c
应该是变量,而不是普通字符串“c”,所以你似乎意味着$c
。
所以你应该有更像mid=$c
的东西。
您也可以考虑通过使用shell内置printf
命令来避免第一个if
链来简化此操作:
mid=$(printf "%03d" $c)
答案 1 :(得分:2)
您不使用$
在shell脚本中分配变量。此外,for file in
遍布您提供的字符串,而不是目录,因此请使用for file in *
。