Estoy intentando escribir un script bash donde parte de un directorio es una cadena larga y desconocida. Conozco la primera parte del nombre del directorio. ¿Cómo combino la cadena conocida y el comodín en la ruta? Por ahora tengo:
ID=$1;
IMP="[email protected]:/data/"$ID"/EER_DATA/$ID"*"/ImpostorScores.txt"
pero esto pasa un literal *
.
Respuesta1
Hay varias opciones,
- Utilice NFS o FUSE-over-SSH o algo así para exponer el sistema de archivos remoto localmente, luego aplique el globo
bash
predeterminado en esa ruta del sistema de archivos exportado.FOO=/*/passwd
(ZSH tiene una${~spec}
expansión de parámetro de sustitución global; de lo contrario, consulte el manual de su shell). - SSH al sistema remoto y haga el trabajo allí.
ssh host 'echo /*/passwd'
- Pase el globo escapado (o desactivado mediante barra invertida o comillas simples) al sistema remoto,
scp host:/\*/passwd .
Algunas de estas opciones son propensas a condiciones de carrera si el nombre del archivo cambia entre el momento en que finaliza el global y cualquier paso posterior que involucre ese nombre de archivo (posiblemente cambiado).
Respuesta2
Puedes usar tar sobre ssh,
tar cf - filename | ssh [email protected] "cd /data/$ID/EER_DATA/$ID*; tar xf -"
Asegúrese de haber configurado ssh-agent para que no le solicite la contraseña. No creo que puedas usar un directorio comodín con scp, ni siquiera trabajando con un cp normal.
Probé esto en bash y zsh.
Respuesta3
El lado derecho de una "Asignación de variable" se considera entrecomillado (sin división ni globalización):
LESS=+'/A variable may be assigned' man bash
Se puede asignar una variable mediante una declaración de la forma:
nombre=[valor]
No se realiza la división de palabras, ... . La expansión del nombre de ruta no se realiza.
Por lo tanto:
$ var=*
$ echo "$var"
*
Para que un asterisco se expanda, debe usarlo sin comillas:
var="$(echo *)" ### Expand to the list of files on pwd.
En tu caso:
$ ID=one
$ IMP="$( echo "[email protected]:/data/$ID/EER_DATA/"*"/ImpostorScores.txt")"
$ echo "$IMP"
[email protected]:/data/one/EER_DATA/something/ImpostorScores.txt
Ese algo se expandirá si toda la ruta coincide, es decir, si realmente existe un árbol como este:
$ tree [email protected]\:/
[email protected]:/
└── data
└── one
└── EER_DATA
└── something
└── ImpostorScores.txt
Nota: eliminé el segundo $ID
de su fuente, fácil de reemplazar.