我试图将某些文件重命名为另一个扩展名:
# mv *.sqlite3_done *.sqlite3
但收到了错误:
mv: target '*.sqlite3' is not a directory
为什么?
答案 0 :(得分:6)
mv
只能将多个文件移动到一个目录中;它不能将每个人移动到不同的名称。你可以用bash循环:
for x in *.sqlite3_done; do
mv "$x" "${x%_done}"
done
${x%_done}
从_done
的末尾删除$x
。
答案 1 :(得分:2)
通配符扩展会导致多个名称传递给命令。 shell认为您正在尝试将多个文件移动到'1
目录。
您需要使用循环:
*.sqlite3
for nam in *sqlite3_done
do
newname=${nam%_done}
mv $nam $newname
done
表示从字符串中删除最后一次出现的%_done
。
如果您的文件名中可能包含空格,则需要引用文件名。
答案 2 :(得分:0)
简单的方法是使用find
find . -type f -name '*.sqlite3_done' -exec sh -c 'x="{}"; mv "$x" "${x%_done}"' \;