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

Я использую Greyhole, и он идеально подходит для моего использования:

повторное использование домашним сервером запасных hdds с разными брендами, моделями, размерами все пространство hdds можно рассматривать как одно большое крепление (например, jbod) вы можете устанавливать разные домены с различными потребностями резервирования (т. е. Photos = max redundancy, Data = простая избыточность, фильмы = нулевая избыточность). Обновление hdds может выполняться по одному (т. е. вы можете удалить 500 ГБ hdd и замените его на 4 тб hdd, увеличивая общую емкость) потеря одного hdd потеряет только данные с нулевым избыточным резервированием на этом hdd, если hdd отправляет раннее предупреждение, которое вот-вот выйдет из строя (из мониторинга интеллектуальных параметров), я могу легко заменить его с другим без потери данных hdds можно перенести из sata в USB-корпус, не делая ничего на самом деле, для хранения может быть что угодно: sata hdd, usb hdd, удаленный сетевой ресурс .... (ОЧЕНЬ ВАЖНО), если вы удалите hdd из система Greyhole, это нормально отформатированный диск ext4 с вашими данными в папках easi

Ограничения:

домашний сервер Доступ к данным Greyhole должен осуществляться из Samba-акций (даже локально).
1
задан 16 August 2013 в 17:06

9 ответов

Я бы сделал

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

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

2
ответ дан 24 May 2018 в 18:59

Я только что сделал это:

#!/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

Я не знаю, является ли это наилучшим способом выполнить то, что вы хотите.

Использование:

[ f2]

Скрипт будет просто cd во втором каталоге, который он найдет. Просто имейте в виду, что это не будет работать для скрытых каталогов.

1
ответ дан 24 May 2018 в 18:59

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

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$ 

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

1
ответ дан 24 May 2018 в 18:59

Я немного не уверен в том, чего вы хотите на самом деле, но я интерпретирую ваш вопрос как желающий «однострочный», который захватывает список каталогов в $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 не удалась. [ ! d8]

1
ответ дан 24 May 2018 в 18:59

Я немного не уверен в том, чего вы хотите на самом деле, но я интерпретирую ваш вопрос как желающий «однострочный», который захватывает список каталогов в $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 не удалась. [ ! d8]

1
ответ дан 24 May 2018 в 18:59

Я немного не уверен в том, чего вы хотите на самом деле, но я интерпретирую ваш вопрос как желающий «однострочный», который захватывает список каталогов в $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 не удалась. [ ! d8]

1
ответ дан 24 May 2018 в 18:59

Я немного не уверен в том, чего вы хотите на самом деле, но я интерпретирую ваш вопрос как желающий «однострочный», который захватывает список каталогов в $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 не удалась. [ ! d8]

1
ответ дан 24 May 2018 в 18:59

Я немного не уверен в том, чего вы хотите на самом деле, но я интерпретирую ваш вопрос как желающий «однострочный», который захватывает список каталогов в $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 не удалась. [ ! d8]

1
ответ дан 24 May 2018 в 18:59

Я немного не уверен в том, чего вы хотите на самом деле, но я интерпретирую ваш вопрос как желающий «однострочный», который захватывает список каталогов в $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 не удалась. [ ! d8]

1
ответ дан 24 May 2018 в 18:59

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

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