我有一个剧目,其中一些文件必须重命名:
alabama.txt california1.txt california2.txt california3.txt florida.txt
californiaX.txt
个文件应重命名为cX.txt
,X
为数字。
以下是我的尝试:
ls | sed 's/california/c/'
但是这不能存储结果。阅读其他一些帖子,我尝试添加sh
,但它说“找不到命令”。
ls | sed 's/california/c/' | sh
rename
命令也不起作用(我在Mac上)。
mv
命令仅适用于文件。所以我尝试了一个循环,它同样不起作用:
for file in california*; do mv file c*; done
欢迎任何关于我做错的信息。
答案 0 :(得分:2)
一个变量,当被引用时应该用$引导(当声明时,它不是)。并且,您应该将参数替换设置为" file"变量:
for file in california*; do mv "$file" "${file/california/c}"; done
答案 1 :(得分:1)
将mv
与bash
substring-extraction一起使用
for file in california*.txt
do
mv -v -- "$file" "${file:0:1}${file:10:1}.${file#*.}"
done
这里,--
是一个bash
内置的,用于表示命令选项的结束,之后只接受位置参数,不再有命令标志。子字符串提取部分是
$ {string:position}和$ {string:position:length}
“string”指定我们的变量名称,“position”是我们从中提取信息的起点。我们可以使用“length”参数进一步微调。当长度与位置一起使用时,这意味着显示从位置x开始的长度为y的信息。
答案 2 :(得分:1)
要重命名文件,您需要:1。旧名称,2。新名称。
您尝试获取旧名称或新名称。没有人试图同时找到两者。
以下是您尝试将这些尝试整合到一个有效的解决方案中:
for file in california*
do
newname=$(echo "$file" | sed 's/california/c/')
mv "$file" "$newname"
done
这可以通过参数扩展以规范方式编写:
for file in california*
do
mv "$file" "c${file#california}"
done