更改Shell脚本以将文件名中的数字替换为互补序列

px9o7tmv  于 8个月前  发布在  Shell
关注(0)|答案(1)|浏览(69)

我有大约160个文件,文件名中有连续的编号,如abc_1_def.extuvw_162_yxz.ext。这些数字是按时间顺序生成的,不幸的是,最新的数据排在第一位,最古老的数据排在最后。我们倾向于按照正确的历史顺序重命名这些文件,即abc_162_def.extuvw_1_yxz.ext;这意味着在历史序列中增加数字。一种堆栈任务。
我自己也试过,虽然我没有什么好主意来操纵数字。有大量的样品添加一个固定的数字,同样。不过,不是针对这种LiFo的问题。感谢任何建议!

ecfdbz9o

ecfdbz9o1#

做一些假设-

touch foo_{1..20}_bar.ext       # simplified set
shopt -s extglob                # more specific globbing
mkdir hold                      # a place to avoid naming collisions
mv *_+([0-9])_*.ext hold/       # make sure this grabs the right set
declare -i cnt=0                # reinitialize this is you run it again!
lst=( $( printf "%s\n" hold/* | 
           sort -t_ -k2,2rn ) ) # reverse numeric order on the key
for f in "${lst[@]}"
do n="${f#hold/}"               # strip subfolder to move them *back* 
   mv "$f" "./${n/_+([0-9])_/_$((++cnt))_}" # replace/reorder the numbers
done

我用echo运行了它:

$: for f in "${lst[@]}"; do n="${f#hold/}"; echo mv "$f" "./${n/_+([0-9])_/_$((++cnt))_}"; done
mv hold/foo_20_bar.ext ./foo_1_bar.ext
mv hold/foo_19_bar.ext ./foo_2_bar.ext
mv hold/foo_18_bar.ext ./foo_3_bar.ext
mv hold/foo_17_bar.ext ./foo_4_bar.ext
mv hold/foo_16_bar.ext ./foo_5_bar.ext
mv hold/foo_15_bar.ext ./foo_6_bar.ext
mv hold/foo_14_bar.ext ./foo_7_bar.ext
mv hold/foo_13_bar.ext ./foo_8_bar.ext
mv hold/foo_12_bar.ext ./foo_9_bar.ext
mv hold/foo_11_bar.ext ./foo_10_bar.ext
mv hold/foo_10_bar.ext ./foo_11_bar.ext
mv hold/foo_9_bar.ext ./foo_12_bar.ext
mv hold/foo_8_bar.ext ./foo_13_bar.ext
mv hold/foo_7_bar.ext ./foo_14_bar.ext
mv hold/foo_6_bar.ext ./foo_15_bar.ext
mv hold/foo_5_bar.ext ./foo_16_bar.ext
mv hold/foo_4_bar.ext ./foo_17_bar.ext
mv hold/foo_3_bar.ext ./foo_18_bar.ext
mv hold/foo_2_bar.ext ./foo_19_bar.ext
mv hold/foo_1_bar.ext ./foo_20_bar.ext

相关问题