使用 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>
再次对重复的内容感到抱歉,但我无法通过阅读来解决我的问题。我确定我只是错误地使用了 mv
和 sed
的组合。
解决方案已在评论中输入。我使用的是 $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 调用
首先,我想说我知道这几乎与我读过的一些帖子完全相同,但没有任何参考。
我有 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>
再次对重复的内容感到抱歉,但我无法通过阅读来解决我的问题。我确定我只是错误地使用了 mv
和 sed
的组合。
解决方案已在评论中输入。我使用的是 $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 调用