我的目录中有一些文件:touch dir1/dir2/bad\ name{1..4}
。我想将这些文件(bad name1 - bad name4
)从dir2
移到dir1
,并立即重命名。由于这些文件的名称不正确,因此我将其简称为ls bad*
。现在按照我的意愿移动它们,我将尝试for i in $(ls *bad); do mv $i ../anothername{a..d}; done
。我要解决的问题是如何进行一对一的映射(在循环和扩展之间)-即
对于for循环的一次迭代,进行大括号的一次扩展
我bad\ name
故意放了进去,因为我可以这样做mv bad\ name{1..4} ../anothername{a..d}
,因此不需要for loop
,因此也没有问题,但是我想将这些文件与file expansion
*
-一起使用,ls bad*
并将它们映射到for循环中brace expansion
(gnu brace expand)。是否可能,或者大括号无法在一次迭代中扩展for循环?因此,唯一的选择是在mv的两边都用大括号(如mv bad\ name{1..4} ../anothername{a..d}
)
我想在给定工具(Bash)的情况下,从易读性的角度来看,没有任何解决方案会真正简单明了。正如对问题的评论中概述的那样,您还可以设计一种仅适用于字符串(无数组)的方法。但是,阵列的优点是可以替换各种长度。
无论如何,这是我的示例(这echo
是有意的,因此,如果有人粘贴并执行脚本,这不会立即开展业务):
#!/usr/bin/env bash
replacements="aabbccdd"
let step=2
let max=$((${#replacements}/step))
for ((i=1;i<=$max;i++)); do
echo mv bad\ name$i ../anothername${replacements:$((i*step-step)):$step}
done
(经测试,发现它可以与Bash 4.4.20一起使用)
step
设置为单个替换的长度replacements
持有一个字符串,我们将从中截取一些长度 step
i
作数字索引变量${replacements:...:...}
执行单个替换
$((i*step-step))
是一个算术表达式,该表达式似乎就是它的样子:i*step-step
...在-step
那里可以找到从零开始的字符串索引...$step
是我们从replacements
琴弦上切下的每一块的长度eval
...来完成,但是它对可读性没有帮助。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句