一次迭代两个序列

时间:2018-09-22 13:18:02

标签: bash shell

我有一堆文件aaaaabaad,...(请注意,没有aac)或概括地说,所有文件与a[a-z][a-z]匹配,其中并非每个文件都存在,我想以更紧凑的方式重命名它们,即mv aad aac

我可以使用其他方法(后面是Pythonish伪代码)

from string import lowercase as lc
a = 'a'
for old, new in zip(glob('a[a-z][a-z]'), (a+b+c for b in lc for c in lc)):
    if old != new:  rename(old, new)

但是我想仅使用shell来解决问题,有技巧的人吗?

我使用Bash,但我也希望看到不同外壳中的解决方案-另一方面,我对使用与外壳本身不同的编程语言的解决方案不感兴趣。


根据要求

aaa  aab  aad  aaf  aag  aah  aai  aam  ...
aaa  aab  aac  aad  aae  aaf  aag  aah  ...

前两对对应一个no-op,其他所有对都需要重命名文件:

$ mv aad aac
$ mv aaf aad
$ ...

1 个答案:

答案 0 :(得分:2)

您可以构建两个数组:

old_names=( a[a-z][a-z] )
new_names=( a{a..z}{a..z} )

然后并行遍历它们:

for ((i=0; i < ${#old_names[@]}; i++ )); do
  old_name=${old_names[i]}
  new_name=${new_names[i]}
  # if [ -z "$new_name" ]; then
  #  break
  # fi
  if [ "$old_name" != "$new_name" ]; then
    mv -- "$old_name" "$new_name"
  fi
done