Как символически связать файлы с новым каталогом на основе имен в текстовом файле?

Просто в дополнение к тому, что сказали другие пользователи, фактический синтаксис составной команды if:

if compound_list
then compound_list
[elif compound_list
then compound_list]...
[else compound_list]
fi

Где compound_list— это, по сути, список любого количества команд. ifпроверит код выхода последней команды первой COMPOUND_LIST, чтобы решить, что выполнять (, then..., одну из elif...; then...илиelse...).

Это означает, что вы можете переписать это так:

if foo "$1"; then
  # Code to execute if foo returns 0
else
  # Code to execute if foo returns 1
fi

Если fooможет возвращать множество других статусов (2, 3,..., 254, 255), то лучше использовать case:

foo "$1"

case "$?" in
  0) # Code to execute if foo returns 0 ;;
  1) # Code to execute if foo returns 1 ;;
  2) # Code to execute if foo returns 2 ;;
  3) # Code to execute if foo returns 3 ;;
 ...
  254) # Code to execute if foo returns 254 ;;
  255) # Code to execute if foo returns 255 ;;
esac

Редактировать 1

is ";" after "$1" is defined in syntax?

Да, и, как заявил Кусалананда, он используется как разделитель команд.

POSIX определяет следующие команды:

  • Простая команда:[assignments] program [arguments] [redirections]
  • Трубопровод:[!] command [pipe_operator command]...
  • Список :
    • И -ИЛИ список:pipeline [and-or_list_operator pipeline]...
    • Составной список:and-or_list [compound_list_operator and-or_list]
  • Составная команда :
    • Группировка команд :
      • ( compound_list )
      • { compound_list; }
    • Для:for name [in words]; do compound_list; done
    • Чемодан:case word in [[(] patterns ) compound_list ;;]... esac
    • Если:if compound_list; then compound_list; [elif compound_list; then compound_list;]... [else compound_list;] fi
    • Пока:while compound_list; do compound_list; done
    • До:until compound_list; do compound_list; done
  • Команда определения функции:name() compound_command [redirections]

compound_list_operatorможет быть точкой с запятой или новой строкой и используется в контексте compound_list/ for/ case/ if/ while/ until.

Обратите внимание, что точка с запятой также требуется, когда в команде { compound_list; }последняя команда compound_listи закрывающая скобка }находятся в одной строке.

0
05.05.2020, 03:19
1 ответ

Вы связываете все файлы в /path/to/STRBAM/*и /path/to/New/несколько раз, так как вы используете *в исходном пути, а не {}, т.е.:

awk 'NR > 1{ print $1 }' All.txt | xargs -I{} ln -s /path/to/STRBAM/{}.bam /path/to/New/

Если вы хотите добавить дополнительную проверку наличия символической ссылки в исходном каталоге, вы можете использовать небольшой сценарий оболочки и передать исходный код и каталог назначения в качестве первых двух позиционных параметров скрипта:

awk 'NR > 1{ print $1 }' All.txt | xargs sh -c '
 src=$1; shift
 dest=$1; shift
 for i do
   if [ -h "$src/${i}.bam" ]; then
     ln -s "$src/${i}.bam" "$dest"
   fi
 done
' sh /path/to/STRBAM /path/to/New
1
28.04.2021, 23:16

Теги

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