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

Если я правильно понимаю, у вас есть файл samples_long.20Bids.txt, содержащий имена, по одному имени в строке. У вас есть каталог, содержащий файлы (или который позже будет содержать файлы ). Вы хотите создать символические ссылки из другого каталога в этот каталог с тем же базовым именем для файлов.

Это легко сделать с помощью петли оболочки. (См. Понимание "IFS= чтение -r строки" для подробного объяснения того, как работает этот цикл. Простое объяснение состоит в том, что тело цикла выполняется один раз для каждой строки в файле.)

while IFS= read -r line; do
  ln -s "/disk1/results/alignment/P2_90/$line".
done 

Я не буду объяснять, что вы сделали не так с кодом awk, потому что понятия не имею, что вы хотели сделать.

0
22.11.2021, 01:44
3 ответа

Вы можете создать функцию-оболочку вокруг 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 о поведении ~.

1
22.11.2021, 05:39

Чтобы сделать это надежно для любой/всех команд, вам потребуется модифицировать стандартную системную библиотеку, которая обрабатывает подпрограммы файлового ввода-вывода. Не невозможно, но более сложно, чем я хочу здесь описать.

Переменная $CDPATH, как описано в другом ответе здесь, отлично подойдет для cd, но не будет работать как обобщенное решение.

Вы можете использовать имя переменной, project=/path/to/projectdir, и тогда ls $project/project1может работать. Предупреждение здесь заключается в том, что переменная без кавычек не может содержать пробелы. Правильнее было быls "$project/project1"

Или создайте символическую ссылку в верхней части вашего каталога $HOME, cd; ln -s /path/to/projectdir project, чтобы ls ~/project/project1работал.

0
22.11.2021, 07:12

Расширение ~до вашего домашнего каталога связано с управлением пользователями. Но расширение тильды может сделать больше. Если бы у вас был пользователь с именем Projects , тильда ~projectsрасширилась бы до домашнего каталога этого пользователя, вероятно, /home/projects/.

Заключение:никогда не говорите, что я это рекомендовал, но если вы не возражаете немного злоупотребить своей системой, вы можете добавить пользователя с именем проекты(такие команды, как useraddи adduserможет помочь, если в вашем дистрибутиве нет графического интерфейса для него ), и дайте себе полный доступ к домашнему каталогу проектов, возможно, даже сделайте себя его владельцем:chown you:yourgroup ~projects/. Вы даже можете отключить вход в систему для этих фиктивных пользовательских проектов с помощьюpasswd -l projects(-l для блокировки ). Если пользовательские проекты не могут войти в систему, ему или ей не понадобится весь материал, который был помещен в его или ее домашний каталог при его создании, поэтому удалите все это. Все это должно быть сделано как root, конечно.

0
22.11.2021, 23:45

Теги

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