首先,我想说我知道这几乎与我读过的一些帖子完全相同,但是没有任何运气参与。
我有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>
同样,我很抱歉这个副本,但我无法通过阅读来解决我的问题。我确定我只是错误地使用mv
和sed
的组合。
在评论中输入了解决方案。我使用$ file而不是$ fl。
答案 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
sed --posix
代替简单的sed调用