查找并替换循环shell

时间:2017-06-19 07:03:56

标签: shell file-handling find-replace

使用以下命令,我的脚本成功完成。

for file in collectorlist*  ; do mv "$file" "${/bak_/{file}}" ; done 

现在我想将bak_ {file}移动到重置为原始文件名的{file}。我尝试了以下方式,抛出错误。,您的建议表示赞赏。

for file in bak_collectorlist*; do mv "$file" "${/bak_/{file}}" ; done 

2 个答案:

答案 0 :(得分:0)

使用:

for file in bak_collectorlist*; do mv "$file" "${file/bak_/}" ; done

来自 bash man

  

${parameter/pattern/string} 模式替换

     

扩展模式以生成与路径名一样的模式   扩张。 参数展开模式的最长匹配   对于,其值将替换为字符串。如果模式以/开头,   模式的所有匹配都用字符串替换。通常只有   第一场比赛被替换。如果模式以#开头,则必须匹配   在参数的扩展值的开头。如果模式   以%开头,它必须在扩展值的末尾匹配   参数。如果string为null,则删除pattern的匹配项   /可以省略以下图案。如果参数是@或*,则   替换操作应用于每个位置参数   转,扩展是结果列表。如果参数是   用@或*下标的数组变量,替换操作是   依次应用于数组的每个成员,并且扩展是   结果清单

<强>演示

$ ll bak_collectorlist*
-rw-r----- 1 klashxx klashxx 2 Jun 19 09:13 bak_collectorlist
-rw-r----- 1 klashxx klashxx 2 Jun 19 09:13 bak_collectorlist2
$
$ for file in bak_collectorlist*;do echo "$file" "${file/bak_/}" ; done
bak_collectorlist collectorlist
bak_collectorlist2 collectorlist

答案 1 :(得分:-1)

您需要将第二次运行中的文件名从bak反转为原始

 for file in bak_collectorlist*; do mv "./bak_/${file}" "$file"  ; done