Если я правильно понимаю, у вас есть файл samples_long.20Bids.txt
, содержащий имена, по одному имени в строке. У вас есть каталог, содержащий файлы (или который позже будет содержать файлы ). Вы хотите создать символические ссылки из другого каталога в этот каталог с тем же базовым именем для файлов.
Это легко сделать с помощью петли оболочки. (См. Понимание "IFS= чтение -r строки" для подробного объяснения того, как работает этот цикл. Простое объяснение состоит в том, что тело цикла выполняется один раз для каждой строки в файле.)
while IFS= read -r line; do
ln -s "/disk1/results/alignment/P2_90/$line".
done
Я не буду объяснять, что вы сделали не так с кодом awk, потому что понятия не имею, что вы хотели сделать.
Вы можете создать функцию-оболочку вокруг cd
, которая выполняет специальное действие соуса.
cd(){
case "$1" in
(projects|projects/*)
local dir="$1"
command cd "/some/dir/${dir}" ;;
(*)
command cd "$@" ;;
esac
}
С небольшим обобщением это можно расширить для обработки нескольких специальных путей, а с небольшим дополнительным уточнением специальный путь даже не должен быть частью пункта назначения.
А именно:
cd(){
local dir=''
local input="${1}/" # force on / to make matches and substitutions easier
case "${input}" in
(projects/*) dir="/some/dir/$input" ;;
# prj is a nick name for "projects"
(prj/*) dir="/some/dir/projects/${input#*/}" ;;
(foobar/*) dir="/another/place/$input" ;;
# : is a nickname for foobar
(:/*) dir="/another/place/foobar/${input#*/}" ;;
(*)
command cd "$@"
return
;;
esac
command cd "${dir}"
}
Это позволяет вам указать псевдоним для целевого каталога, взяв лист вдохновения из упоминания OP о поведении ~
.
Чтобы сделать это надежно для любой/всех команд, вам потребуется модифицировать стандартную системную библиотеку, которая обрабатывает подпрограммы файлового ввода-вывода. Не невозможно, но более сложно, чем я хочу здесь описать.
Переменная $CDPATH
, как описано в другом ответе здесь, отлично подойдет для cd
, но не будет работать как обобщенное решение.
Вы можете использовать имя переменной, project=/path/to/projectdir
, и тогда ls $project/project1
может работать. Предупреждение здесь заключается в том, что переменная без кавычек не может содержать пробелы. Правильнее было быls "$project/project1"
Или создайте символическую ссылку в верхней части вашего каталога $HOME
, cd; ln -s /path/to/projectdir project
, чтобы ls ~/project/project1
работал.
Расширение ~
до вашего домашнего каталога связано с управлением пользователями. Но расширение тильды может сделать больше. Если бы у вас был пользователь с именем Projects , тильда ~projects
расширилась бы до домашнего каталога этого пользователя, вероятно, /home/projects/
.
Заключение:никогда не говорите, что я это рекомендовал, но если вы не возражаете немного злоупотребить своей системой, вы можете добавить пользователя с именем проекты(такие команды, как useradd
и adduser
может помочь, если в вашем дистрибутиве нет графического интерфейса для него ), и дайте себе полный доступ к домашнему каталогу проектов, возможно, даже сделайте себя его владельцем:chown you:yourgroup ~projects/
. Вы даже можете отключить вход в систему для этих фиктивных пользовательских проектов с помощьюpasswd -l projects
(-l для блокировки ). Если пользовательские проекты не могут войти в систему, ему или ей не понадобится весь материал, который был помещен в его или ее домашний каталог при его создании, поэтому удалите все это. Все это должно быть сделано как root, конечно.