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
,那么您应该可以安全地获取它的源代码。我从来没有遇到过这样的情况。谢谢你的回复,很抱歉造成混乱!