Kann man in bash -e mit * nach einer Datei mit einem halbvariablen Namen suchen?


0

Ich habe dann eine Suche nach bestimmten Dateien. Sie fangen alle mit lib an, also konnte ich entweder einen für jedes festlegen oder ich hoffte, es gibt eine Möglichkeit, ein Sternchen zu verwenden.

Hier ist was ich habe und was ich versucht habe.

 d=myfolder
 if [[ -e $d/lib* ]]; then
  mv /etc/launchd.conf $d/launchd.conf
 else
  2>/dev/null; true
 fi

Wenn also eine dieser lib-Dateien vorhanden ist, möchte ich auch die Datei launchd.conf verschieben. aber das Sternchen macht es nicht. Irgendwelche Ideen?

Antworten:


1

Von man bash

[[ expression ]]
      Return a status of 0 or 1 depending on the evaluation of the conditional 
      expression expression.  Expressions  are composed  of  the primaries 
      described below under CONDITIONAL EXPRESSIONS. Word splitting and pathname
      expansion are not performed on the words between the [[ and ]]; tilde 
      expansion, parameter and variable  expansion,  arithmetic expansion, command 
      substitution, process substitution, and quote removal are performed.
      Conditional operators such as -f must be unquoted to be recognized as primaries.

Oder kurz gesagt, das Muster wird nicht erweitert.

Eine einfache Alternative könnte aussehen

if [[ $(echo $d/lib*) != "$d/lib*" ]]; then
    mv /etc/launchd.conf $d/launchd.conf
fi

Kurze Erklärung, wie das funktioniert:

  • echo $d/lib* erweitert, falls vorhanden, zu einer Liste von Bibliotheksdateien $d/lib* (was nicht erweitert wird) so die mv ausgeführt wird
  • OTOH Wenn keine Bibliotheksdateien vorhanden sind, gibt das Echo die Zeichenfolge zurück $d/lib*, das != wertet falsch aus und die mv wird nicht ausgeführt

Ich versuche, die von Ihnen bereitgestellte Alternative zu implementieren, aber sie erfüllt nicht das, was ich brauche. Möglicherweise muss ich auch klarstellen, dass ich den Dateinamen mit dem Sternchen anhebe und keine ausführbare Datei finde. Ich werde versuchen zu erklären, was die Alternative tut, um zu sehen, ob ich es richtig verstehe.
ElRojito

Ich habe Ihre Frage möglicherweise falsch verstanden, aber es ist nicht Ihr Ziel zu sehen, ob passende Dateien vorhanden sind $d/lib*?
nohillside

Entschuldigung, ich habe zu lange gewartet, um das Ende meines Kommentars hinzuzufügen haha. Das Ziel ist es zu sehen, ob es Dateien gibt, die mit $ d / lib übereinstimmen. Beispiele: libgenkit.dylib, libgenkitsa.dylib, libimckit.dylib, libimckitsa.dylib. Wenn sich eine dieser Dateien im Ordner $ d befindet, möchte ich die Datei launchd.conf verschieben. Wenn nicht, tu nichts. Wenn die Variable (myfolder) mit / lib * nicht mit myfolder / lib * identisch ist (wenn also wahr ist), verschieben Sie launchd.conf.
ElRojito

Was ist, wenn ich keinen Tippfehler gemacht habe, was die Alternative tun sollte. echo $d/lib* erweitert, falls vorhanden, zu einer Liste von Bibliotheksdateien; $d/lib* (was nicht erweitert wird) so die mv ausgeführt wird. OTOH Wenn keine Bibliotheksdateien vorhanden sind, kehrt das Echo zurück $d/lib*, das != wertet falsch aus und die mv wird nicht ausgeführt. Zumindest hat es hier so funktioniert :-)
nohillside

1
Patrix, danke für die Antwort. Es hat funktioniert, das Problem, auf das ich gestoßen bin, war, dass ich den Zitaten nicht richtig entging, da es in einem ausgeführt wird do shell script Befehl in AppleScript.
ElRojito
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.