UNIX-如何编写bash脚本以自动更改到下一个/上一个目录

UNIX-如何编写bash脚本以自动更改到下一个/上一个目录,bash,unix,directory,cd,Bash,Unix,Directory,Cd,假设我有这个文件夹结构: MainFolder Folder1 Folder2 Folder3 ... Folder200 我想编写一个脚本,如果我在Folder2中处于当前状态并执行该脚本,它将自动更改为列表中的下一个目录,在本例中为Folder3。限制是文件夹可以有任何名称,我不能重命名它 因此,我的问题是: 1) 我怎么知道下一个目录是什么?我想知道一个目录的子目录是否有一个顺序索引号,我可以用它来知道下一个目录是什么 2) 因为我想在脚本末尾显示

假设我有这个文件夹结构:

MainFolder
    Folder1
    Folder2
    Folder3
    ...
    Folder200
我想编写一个脚本,如果我在Folder2中处于当前状态并执行该脚本,它将自动更改为列表中的下一个目录,在本例中为Folder3。限制是文件夹可以有任何名称,我不能重命名它

因此,我的问题是:

1) 我怎么知道下一个目录是什么?我想知道一个目录的子目录是否有一个顺序索引号,我可以用它来知道下一个目录是什么

2) 因为我想在脚本末尾显示新目录的名称,所以有没有办法只显示目录名称?(例如:Folder3而不是/home/path/to/dir/Folder3,后者是“pwd”的结果)

  • 什么定义了目录的处理顺序?如果目录名称中没有空格和其他特殊字符,可以使用
    ls
    按顺序列出目录,然后在当前目录后查找名称:

    cwd=$(basename $PWD)
    nwd=$(ls .. | awk "/^$cwd$/ { found = 1; next; } { if (found) { print; found = 0 } }")
    if [ -d ../$nwd ]
    then cd ../$nwd
    fi
    
  • 使用
    basename$PWD
    ${PWD##*/}
    可以找到目录名(仅限)


  • 假设序列没有孔,这应该是可行的

    cdn()
    {
      cd ${PWD%%[0-9]*}$(( $(echo $PWD | sed 's/.*[^0-9]//')+1))
    }
    
    编辑:似乎我忽略了“目录可以有任何名称”的声明。从你的例子中,我假设他们有一个尾随数字id

    如果您在示例中使用随机名称而不是Folderxx,则会更清楚

    Edit2:下面是一个符合您需求的shell函数:

    cdn()
    {
        for i in $(echo "/\/$(basename $PWD)$/
    +1,\$p
    Q" | ed -s !"ls -d ../*" | tail -n +2)
        do
            \cd $i 2>/dev/null && echo $(basename $PWD) && break
        done
    }
    

    可以假定每个文件夹中只有一个文件夹吗?请注意,您必须获取脚本的源代码,否则它将在子shell中运行,并且无法更改当前shell的当前目录。或者更好,使用shell函数。这正是我要找的,谢谢!我看到脚本应该可以工作,但是当我尝试寻找它时,我收到消息“非法变量名”。你知道我遗漏了什么吗?你为什么要找这样的剧本?我能看到的唯一可能的“非法变量名”是
    ${PWD##*/}
    ,如果您的shell不是
    bash
    ,并且不识别
    #
    符号,则该名称实际上是无效的。我仍然使用
    basename
    ,因为我在四分之一世纪前就学会了它,而且它仍然有效。如果仍然存在问题,请使用
    bash-xscript
    查看它在做什么(而不影响当前shell),而不是寻找脚本的来源。然后返回一个报告(bash-x脚本的输出),如果您自己看不到问题所在。我使用了bash-x脚本并修复了脚本中的一个输入错误(感谢向我介绍调试器)。但是,尽管脚本显示在调试器中工作,但它在子shell上运行,因此不会真正更改目录。我试图寻找它的来源,这是当我得到非法变量名错误消息。有没有办法修复它?听起来你的shell不是bash?如果
    bash-xscript
    工作正常,并且您的shell是
    bash
    ,那么您应该可以安全地获取它的源代码。我从来没有遇到过这样的情况。谢谢你的回复,很抱歉造成混乱!