命令并利用其结果来运行另一个命令

命令并利用其结果来运行另一个命令

我想要创建lscd显示第一个或第二个目录,无论第一个或第二个目录的名称是什么(dir1dir2,在本例中):

$ 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 命令失败,它会关闭交互式终端。

相关内容