我有一堆文件aaa
,aab
,aad
,...(请注意,没有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
$ ...
答案 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