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

Using sed and mv to add characters to files

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

我有 100 多个文件,它们都遵循非常严格的命名约定 5_##_<name>.ext 我的问题是,在最初制作这些文件时,我没有意识到 5_100_ 及更高版本会打乱我的顺序.

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

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

    echo Filename: $fl

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

done

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

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

再次对重复的内容感到抱歉,但我无法通过阅读来解决我的问题。我确定我只是错误地使用了 mvsed 的组合。


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

类似这样的内容可能有用:

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_”文件还没有时才重命名它们存在...

#!/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 调用