Используйте подстановочный знак в пути к каталогу

Используйте подстановочный знак в пути к каталогу

Я пытаюсь написать скрипт bash, где часть каталога — это длинная неизвестная строка. Я знаю первую часть имени каталога. Как мне объединить известную строку и подстановочный знак в пути? На данный момент у меня есть:

ID=$1;

IMP="[email protected]:/data/"$ID"/EER_DATA/$ID"*"/ImpostorScores.txt"

но это проходит буквально *.

решение1

Есть несколько вариантов,

  1. Используйте NFS или FUSE-over-SSH или что-то еще, чтобы локально открыть удаленную файловую систему, а затем bashпримените глоб по умолчанию FOO=/*/passwdк этому экспортированному пути файловой системы. (ZSH имеет ${~spec}расширение параметра подстановки глоб, в противном случае обратитесь к руководству по вашей оболочке.)
  2. Подключитесь по SSH к удаленной системе и выполните операцию там.ssh host 'echo /*/passwd'
  3. Передайте экранированный (или иным образом защищенный с помощью обратной косой черты или одинарных кавычек) глобальный символ удаленной системе,scp host:/\*/passwd .

Некоторые из этих параметров подвержены возникновению состояний гонки, если имя файла изменится между моментом завершения операции glob и любыми последующими шагами, включающими это (возможно, измененное) имя файла.

решение2

Вы можете использовать tar поверх ssh,

tar cf - filename | ssh [email protected] "cd /data/$ID/EER_DATA/$ID*; tar xf -"

Убедитесь, что вы настроили ssh-agent, чтобы он не запрашивал у вас пароль. Я не думаю, что вы можете использовать wildcard dir с scp, даже не работая с обычным cp.

Я проверил это на bash и zsh.

решение3

Правая часть «Присвоения переменной» считается заключенной в кавычки (без разделения или глобализации):

LESS=+'/A variable may be assigned' man bash

Переменная может быть назначена с помощью оператора вида:
имя=[значение]
Разбиение слов не выполняется, ... . Расширение имени пути не выполняется.

Поэтому:

$ var=*
$ echo "$var"
*

Чтобы звездочка раскрылась, ее нужно использовать без кавычек:

var="$(echo *)"                ### Expand to the list of files on pwd.

В твоем случае:

$ ID=one
$ IMP="$( echo "[email protected]:/data/$ID/EER_DATA/"*"/ImpostorScores.txt")"
$ echo "$IMP"
[email protected]:/data/one/EER_DATA/something/ImpostorScores.txt

Это что-то будет расширено, если весь путь совпадает, то есть такое дерево действительно существует:

$ tree [email protected]\:/
[email protected]:/
└── data
    └── one
        └── EER_DATA
            └── something
                └── ImpostorScores.txt

Note: I removed the second $ID from your source, easy to re-place.

Связанный контент