Я пытаюсь написать скрипт bash, где часть каталога — это длинная неизвестная строка. Я знаю первую часть имени каталога. Как мне объединить известную строку и подстановочный знак в пути? На данный момент у меня есть:
ID=$1;
IMP="[email protected]:/data/"$ID"/EER_DATA/$ID"*"/ImpostorScores.txt"
но это проходит буквально *
.
решение1
Есть несколько вариантов,
- Используйте NFS или FUSE-over-SSH или что-то еще, чтобы локально открыть удаленную файловую систему, а затем
bash
примените глоб по умолчаниюFOO=/*/passwd
к этому экспортированному пути файловой системы. (ZSH имеет${~spec}
расширение параметра подстановки глоб, в противном случае обратитесь к руководству по вашей оболочке.) - Подключитесь по SSH к удаленной системе и выполните операцию там.
ssh host 'echo /*/passwd'
- Передайте экранированный (или иным образом защищенный с помощью обратной косой черты или одинарных кавычек) глобальный символ удаленной системе,
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.