提问人:udippel 提问时间:8/30/2023 最后编辑:udippel 更新时间:8/31/2023 访问量:76
更改命令行管理程序脚本,将文件名中的数字替换为互补序列
Change Shell script to replace numbers in a file name with complementary sequence
问:
我有大约 160 个文件,文件名内有连续编号,比如 .这些数字是按时间顺序生成的,不幸的是,最新的数据在前,最古老的数据在后。
我们更愿意按照适当的历史顺序重命名这些文件,即 ;意思是在历史序列中增加数字。堆栈任务的种类。abc_1_def.ext
uvw_162_yxz.ext
abc_162_def.ext
uvw_1_yxz.ext
我自己也试过了,虽然我没有任何操纵数字的好主意。有很多样本可以添加固定数字,同样如此。但是,不适用于这种 LiFo 问题。 感谢任何建议!
答:
0赞
Paul Hodges
8/30/2023
#1
做一些假设——
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
评论
0赞
udippel
8/31/2023
谢谢,这正是我想要的!- 不幸的是,我的名声太差了,不能给你一个“箭头”。愚蠢,这个。这是你应得的!我最缺少的是相反的数字顺序,我对 shell 脚本一无所知。再次感谢!
0赞
udippel
9/3/2023
这根本不是批评,拜托!只有万一有人发现这个伟大而有用的项目:当文件名包含空白时,它就会失败。我只注意到,因为一个人最初分配了一个错误的文件名,这在随后的数字中带来了一堆失败。
0赞
Paul Hodges
9/4/2023
你包括报价吗?您是删除了回显,还是将输出发送到文件并单独运行?如果将输出用作脚本,请尝试以下方式:for f in "${lst[@]}"; do n="${f#hold/}"; echo mv "'$f'" "'./${n/_+([0-9])_/_$((++cnt))_}'"; done
0赞
udippel
9/5/2023
并不是说我不再需要它了,也是因为我们无论如何都不允许在文件名中使用空白。只是既然你问了,我几乎按照给定的顺序离开了脚本,只是适应了文件名中数字的位置:lst=( $( printf "%s\n" hold/* | sort -t_ -k 3 -n -r ) ) # reverse numeric order on the key for f in "${lst[@]}" do n="${f#hold/}" # strip subfolder to move them *back* mv "$f" "./${n/2021_+([0-9])_/2021_$((++cnt))_}" # replace/reorder the numbers done
评论
abc_
uvw_
我试过了
;请更新问题,并尝试解决此问题以及您的尝试产生的(错误)结果1
162
1
4
2
3
1
4
1
2