Verwenden Sie ein Platzhalterzeichen im Verzeichnispfad

Verwenden Sie ein Platzhalterzeichen im Verzeichnispfad

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,

  1. Verwenden Sie NFS oder FUSE-over-SSH oder etwas Ähnliches, um das Remote-Dateisystem lokal verfügbar zu machen, und wenden Sie dann bashden Standard- FOO=/*/passwdGlob auf diesen exportierten Dateisystempfad an. (ZSH verfügt über eine ${~spec}Erweiterung für Glob-Substitutionsparameter, andernfalls lesen Sie das Handbuch Ihrer Shell.)
  2. Stellen Sie per SSH eine Verbindung zum Remote-System her und führen Sie dort den Glob aus.ssh host 'echo /*/passwd'
  3. Ü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 $IDaus Ihrer Quelle entfernt, es lässt sich leicht wieder einsetzen.

verwandte Informationen