需要自动增加目录名称,但要避免名称中的某些字母

需要自动增加目录名称,但要避免名称中的某些字母

我的脚本创建了一组目录 aa、ab、ac 等等

该脚本自动增加目录名称,但我想在创建目录时避免使用字母:I,O,P,Q,R,W。

我的脚本包含以下内容:

#!/bin/bash 
path='/tmp/ab' 
dir_name=ls -lrt | tail -1 
export dir_name 
new_name=perl -e 'print ++$ENV{dir_name}' 
mkdir -p $new_name

请提出修改建议。

答案1

这是一个 awk 脚本,允许您生成 AA、AB、AC、AD、AE、AF、AG、AH、AJ、AK、A​​L、AM、AN、AS、AT、AU、AV、AX、AY、AZ、BA、... 序列(代替您拥有的 perl 单行代码):

awk ' BEGIN {
                alphabet = ""
                for (ind = 1; ind <= 26; ind++) {
                        letter = substr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", ind, 1)
                        if (index("IOPQRW", letter) == 0) alphabet = alphabet letter
                }
                alphalen = length(alphabet)
        }
    NF != 1  ||  $1 ~ "[^" alphabet "]" {
                print "bad input" > "/dev/stderr"
                exit
        }
        {
                word = $1
                Len  = length(word)
                for (i = Len; i >= 1; i--) {
                        letter = substr(word, i, 1)
                        val = index(alphabet, letter)
                        if (val <= 0  ||  val > alphalen) {
                                print "This should never happen." > "/dev/stderr"
                                exit
                        }
                        carry = 0
                        if (val == alphalen) {
                                val = 0
                                carry = 1
                        }
                        letter = substr(alphabet, val+1, 1)
                        word = substr(word, 1, i-1) letter substr(word, i+1, Len)
                        if (!carry) break
                }
                if (carry) word = substr(alphabet, 1, 1) word
                print word
        } '

BEGIN部分动态构建 ABCDEFGHJKLMNSTUVXYZ 字母表。您可以这样说

                alphabet = "ABCDEFGHJKLMNSTUVXYZ"

上面的代码让你指定要排除的字母。“错误输入”块拒绝空白输入、多个单词和带有排除字符的单词。

主块从右到左循环给定的单词,执行与将 1 添加到多位十进制数时所执行的操作相同的操作:

  • 如果您有最大符号值(十进制为“9”,方案为“Z”),请将其替换为最低符号并向左移动,
  • 否则,用下一个更高的符号替换该符号并停止。由于 ,alphabet我们有 之后的下一个更高的符号H是 J, 之后的下一个更高的符号N是 S, 之后的下一个更高的符号V是 X。 
  • 如果到达单词开头而没有“结束”,则在前面添加一个 A。例如,ZZ变成AAwhich 然后变成AAA

因此,如果您在 中有一个名字dir_name,则可以使用

new_name=$(echo "$dir_name" | awk '(以上脚本)')
您可能可以去掉“这绝不应该发生。”错误测试。我不知道该错误可能发生的任何方式;我只是想安全。如果您绝对确定您的 shell 脚本永远不会将无效数据传递给 awk 脚本,则可以去掉“错误输入”错误测试。

相关内容