Командуйте и используйте результат для запуска другой команды

Я хочу сделать ls и cd для первого или второго каталога, который он показывает, какое бы имя ни было первым или вторым (в данном случае dir1 или dir2):

[ 110]

Возможно ли это?

ОБНОВЛЕНИЕ :

Я хочу сделать это в терминале без создания внешнего сценария.

2
задан 16 August 2013 в 16:06

5 ответов

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.
0
ответ дан 16 August 2013 в 16:06

Я только что придумал это:

#!/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 во 2-м каталоге, который он найдет. Просто помните, что это не будет работать для скрытых каталогов.

0
ответ дан 16 August 2013 в 16:06

Я бы сделал

alias cd1='cd "$(printf %s\\n */ | sed q)"'
alias cd2='cd "$(printf %s\\n */ | sed -n 2p\;2q)"'

и аналогичные, но у вас могут возникнуть проблемы, если нет одного или двух подкаталогов.

0
ответ дан 16 August 2013 в 16:06

Я написал для вас сценарий, но это не полный ответ на ваш вопрос, но я уверен, что он вам поможет. Я могу перечислить ваш первый каталог с моей командой.

ls | head -n 1 |awk '{print $1 }'

Я не уверен, как перейти в каталог тогда. Я взял ваш пример.

jai@frank-Jai:~/sandbox$ ls | head -n 1 |awk '{print $1 }'
dir1
jai@frank-Jai:~/sandbox$ ls | head -n 2 |awk '{print $1 }'
dir1
dir2
jai@frank-Jai:~/sandbox$ 

мы можем перечислить столько каталогов, сколько захотим.

0
ответ дан 16 August 2013 в 16:06

Я немного не уверен относительно того, что Вы хотите действительно, но я интерпретирую Ваш вопрос как желание 'остроты', которая получает список каталогов в $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 перестала работать.

1
ответ дан 16 August 2013 в 16:06

Другие вопросы по тегам:

Похожие вопросы: