使用sed和mv为文件添加字符

时间:2015-01-22 19:34:38

标签: sed mv

首先,我想说我知道这几乎与我读过的一些帖子完全相同,但是没有任何运气参与。

我有100多个文件都遵循5_##_<name>.ext非常严格的命名惯例我的问题是,当最初制作这些文件时,我没有意识到5_100_及以上会弄乱我的订购。< / p>

我现在尝试在01到99之间的每个数字前面附加一个0。我已经使用sed编写了一个bash脚本,该脚本适用于文件内容(文件名也在文件中):

#!/bin/bash
for fl in *.tcl; do

    echo Filename: $fl

    #sed -i 's/5_\(..\)_/5_0\1_/g' $fl

done

但是,这只会更改内容而不是文件名本身。我已经读过mv是解决方案(rename更简单,但我的系统上没有它)。我目前多次尝试的化身是:

mv "$fl" $(echo "$file" | sed -e 's/5_\(..\)_/5_0\1_/g')但它给了我一个错误:mv: missing destination file operand after <filename>

同样,我很抱歉这个副本,但我无法通过阅读来解决我的问题。我确定我只是错误地使用mvsed的组合。


在评论中输入了解决方案。我使用$ file而不是$ fl。

2 个答案:

答案 0 :(得分:0)

这样的事情可能有用:

for n in $(seq 99)
do
  prefix2="5_$(printf "%02d" ${n})_"
  prefix3="5_$(printf "%03d" ${n})_"

  for f in ${prefix2}*.tcl
  do
    suffix="${f#${prefix2}}"

    [[ -r "${prefix3}${suffix}" ]] || mv "${prefix2}${suffix}" "${prefix3}${suffix}"

  done
done

它不会处理每个文件,而只会查看当前具有“5_XX_”前缀的文件,并且只有在相应的“5_XXX_”文件尚不存在时才重命名...

答案 1 :(得分:0)

#!/bin/bash
for fl in *.tcl
 do
    NewName="$(echo "${fl} | sed '/^5_[0-9]\{2\}_/ s/../&0/' )"
    #echo "Filename: ${fl} -> ${NewName}

    [ ! "${fl}" = "${NewName}" ] && mv ${fl} ${NewName}
done
  • 稍微安全一下,允许在同一个文件夹上传递几次(仅更改所需的文件夹)。
  • 在linux下(默认为非posix sed),使用sed --posix代替简单的sed调用