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

时间:2012-10-20 23:38:55

标签: bash unix directory cd

说我有这个文件夹结构:

MainFolder
    Folder1
    Folder2
    Folder3
    ...
    Folder200

我想编写一个脚本,如果我当前在Folder2中并执行脚本,它将自动切换到列表中的下一个目录,在本例中为Folder3。限制是文件夹可以有任何名称,我无法重命名。

所以我的问题是:

1)如何知道列表中的下一个目录?我想知道一个目录的子目录是否有一个顺序索引号,我可以用它来知道下一个dir。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

这应该有效,假设序列没有漏洞。

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
}