我想要创建ls
并cd
显示第一个或第二个目录,无论第一个或第二个目录的名称是什么(dir1
或dir2
,在本例中):
$ ls { + some command like | grep which would get me to dir1 or dir2 or any other dir I want to }
dir1 dir2 dir3 dir4
是否可以?
更新:
我想在终端中执行此操作,而无需创建外部脚本。
答案1
ls | head -n 1 && cd "$(ls | head -n 1)"
将完成第一个目录的工作。对于第二个目录,使用:
ls | awk 'NR==2' && cd "$(ls | awk 'NR==2')"
对于第 n 个目录,您可以使用:
ls | awk 'NR==n' && cd "$(ls | awk 'NR==n')" #change n with the wished line number.
答案2
我会做
alias cd1='cd "$(printf %s\\n */ | sed q)"'
alias cd2='cd "$(printf %s\\n */ | sed -n 2p\;2q)"'
和类似的,但如果没有一个或两个子目录,您可能会遇到问题。
答案3
我刚刚编了这个:
#!/bin/bash
dir_counter=0
for i in *; do
echo "Checking "$i"";
if [ -d "$i" ]; then
echo "$i is a directory"
let dir_counter=dir_counter+1
if [[ "$dir_counter" == 2 ]]; then
cd "$i"
#inside of $i now
#do whatever you like
pwd
exit 0
fi
else
echo "$i is NOT a directory"
fi
done
我不知道这是否是实现你想要的最佳方法。
用法:
alex@MaD-pc:~$ ls
a Desktop Downloads gsettings_source nitroshare Qt Templates Wallch.DEB.Build
annoying_file.txt Documents Dropbox Music Pictures second_dir.sh Videos
alex@MaD-pc:~$ ./second_dir.sh
Checking a
a is a directory
Checking annoying_file.txt
annoying_file.txt is NOT a directory
Checking Desktop
Desktop is a directory
/home/alex/Desktop
alex@MaD-pc:~$
该脚本只会cd
在找到的第二个目录中执行。请记住,这不适用于隐藏目录。
答案4
我有点不确定你真正想要什么,但我把你的问题解释为想要一个“单行”命令,$HOME
例如,它可以捕获目录列表,然后让你能够 cd 到该列表中的第一个或第二个目录,或者其中任何一个。
我认为这是可能的,如果你把所有目录放在一个大批然后你可以使用 cd 转到该数组中的任何目录,例如,cd "${cdarray[1]}"
这实际上会带你到第二列表中的目录,因为 Bash 数组总是从 0 开始,所以数组中的索引 0 实际上是第一个目录。
这是我创建的一行代码,您可以使用它;请修改它以适合您的目的。我从列表中排除了实际上是符号链接的目录([[ ! -L "$d" ]]
)。如果您需要包括它们,您可以删除此测试,只保留目录的测试。
这是目录的示例$HOME
,我已将其添加$HOME
到命令中,因此路径现在是绝对路径,因此您以后可以cd "${cdarray[1]}"
从任何位置将其作为单独的命令运行,并且它将正常工作。如果您为另一个目录创建它,只需指定该绝对路径,而不是$HOME
在下面的命令中指定,除非您希望它仅相对于创建它的目录工作。
cdarray=(); for d in *; do [[ ! -L "$HOME/$d" && -d "$HOME/$d" ]] && cdarray+=("$HOME/$d"); done; cd "${cdarray[1]}"
现在,任何名称中带有空格的目录都将被成功处理。
声明索引数组,然后如果找到的项目是目录而不是符号链接,则将其添加到数组中,然后在分号后我们 cd 到我们想要的目录,例如cd "${cdarray[1]}"
。
|| exit 1
如果您在脚本中使用了它,则可以在末尾添加,但我没有在上面添加它,因为如果 cd 命令失败,它会关闭交互式终端。