Ich versuche, ein Bash-Skript zu schreiben, bei dem ein Teil eines Verzeichnisses eine lange, unbekannte Zeichenfolge ist. Ich kenne den ersten Teil des Verzeichnisnamens. Wie kombiniere ich die bekannte Zeichenfolge und das Platzhalterzeichen im Pfad? Bis jetzt habe ich:
ID=$1;
IMP="[email protected]:/data/"$ID"/EER_DATA/$ID"*"/ImpostorScores.txt"
aber dies übergibt einen wörtlichen Wert *
.
Antwort1
Es gibt mehrere Möglichkeiten,
- Verwenden Sie NFS oder FUSE-over-SSH oder etwas Ähnliches, um das Remote-Dateisystem lokal verfügbar zu machen, und wenden Sie dann
bash
den Standard-FOO=/*/passwd
Glob auf diesen exportierten Dateisystempfad an. (ZSH verfügt über eine${~spec}
Erweiterung für Glob-Substitutionsparameter, andernfalls lesen Sie das Handbuch Ihrer Shell.) - Stellen Sie per SSH eine Verbindung zum Remote-System her und führen Sie dort den Glob aus.
ssh host 'echo /*/passwd'
- Übergeben Sie den maskierten (oder anderweitig durch Backslash oder einfache Anführungszeichen entschärften) Glob an das Remote-System.
scp host:/\*/passwd .
Bei einigen dieser Optionen kommt es zu Race Conditions, wenn sich der Dateiname zwischen der Fertigstellung des Globs und nachfolgenden Schritten, die diesen (möglicherweise geänderten) Dateinamen betreffen, ändert.
Antwort2
Sie können tar über ssh verwenden,
tar cf - filename | ssh [email protected] "cd /data/$ID/EER_DATA/$ID*; tar xf -"
Stellen Sie sicher, dass Sie den SSH-Agenten so eingerichtet haben, dass er Sie nicht nach dem Kennwort fragt. Ich glaube nicht, dass Sie mit scp ein Wildcard-Verzeichnis verwenden können, es funktioniert nicht einmal mit einem normalen cp.
Ich habe dies auf Bash und Zsh getestet.
Antwort3
Die rechte Seite einer „Variablenzuweisung“ wird als zitiert betrachtet (keine Aufteilung oder Zusammenfassung):
LESS=+'/A variable may be assigned' man bash
Einer Variablen kann eine Anweisung der Form „
Name=[Wert]“ zugewiesen werden.
Es wird keine Worttrennung durchgeführt, ... . Eine Pfadnamenerweiterung wird nicht durchgeführt.
Daher:
$ var=*
$ echo "$var"
*
Um ein Asterisk zu erweitern, müssen Sie es ohne Anführungszeichen verwenden:
var="$(echo *)" ### Expand to the list of files on pwd.
In Ihrem Fall:
$ ID=one
$ IMP="$( echo "[email protected]:/data/$ID/EER_DATA/"*"/ImpostorScores.txt")"
$ echo "$IMP"
[email protected]:/data/one/EER_DATA/something/ImpostorScores.txt
Dieses Etwas wird erweitert, wenn der gesamte Pfad übereinstimmt, das heißt, wenn tatsächlich ein Baum wie dieser existiert:
$ tree [email protected]\:/
[email protected]:/
└── data
└── one
└── EER_DATA
└── something
└── ImpostorScores.txt
Hinweis: Ich habe das Zweite $ID
aus Ihrer Quelle entfernt, es lässt sich leicht wieder einsetzen.