Utilice un comodín en la ruta del directorio

Utilice un comodín en la ruta del directorio

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,

  1. Utilice NFS o FUSE-over-SSH o algo así para exponer el sistema de archivos remoto localmente, luego aplique el globo bashpredeterminado 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).
  2. SSH al sistema remoto y haga el trabajo allí.ssh host 'echo /*/passwd'
  3. 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 $IDde su fuente, fácil de reemplazar.

información relacionada