Я хочу сделать ls
и cd
для первого или второго каталога, который он показывает, какое бы имя ни было первым или вторым (в данном случае dir1
или dir2
):
Возможно ли это?
ОБНОВЛЕНИЕ :
Я хочу сделать это в терминале без создания внешнего сценария.
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.
Я только что придумал это:
#!/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-м каталоге, который он найдет. Просто помните, что это не будет работать для скрытых каталогов.
Я бы сделал
alias cd1='cd "$(printf %s\\n */ | sed q)"'
alias cd2='cd "$(printf %s\\n */ | sed -n 2p\;2q)"'
и аналогичные, но у вас могут возникнуть проблемы, если нет одного или двух подкаталогов.
Я написал для вас сценарий, но это не полный ответ на ваш вопрос, но я уверен, что он вам поможет. Я могу перечислить ваш первый каталог с моей командой.
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$
мы можем перечислить столько каталогов, сколько захотим.
Я немного не уверен относительно того, что Вы хотите действительно, но я интерпретирую Ваш вопрос как желание 'остроты', которая получает список каталогов в $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 перестала работать.