使用条件在命令行中重命名许多文件

时间:2016-12-29 20:20:47

标签: bash

我有一个剧目,其中一些文件必须重命名:

alabama.txt   california1.txt   california2.txt   california3.txt   florida.txt

californiaX.txt个文件应重命名为cX.txtX为数字。

以下是我的尝试:

ls | sed 's/california/c/' 

但是这不能存储结果。阅读其他一些帖子,我尝试添加sh,但它说“找不到命令”。

ls | sed 's/california/c/' | sh

rename命令也不起作用(我在Mac上)。 mv命令仅适用于文件。所以我尝试了一个循环,它同样不起作用:

for file in california*; do  mv file c*; done

欢迎任何关于我做错的信息。

3 个答案:

答案 0 :(得分:2)

一个变量,当被引用时应该用$引导(当声明时,它不是)。并且,您应该将参数替换设置为" file"变量:

for file in california*; do mv "$file" "${file/california/c}"; done

答案 1 :(得分:1)

mvbash 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