Verwenden Sie das '*' im Shell-Skript

Oct 14 2020

Ich versuche ein Befehlsbeispiel auszuführen:

sudo mv /home/vaishnavi/Downloads/*.ttc /home/vaishnavi/Downloads/*.ttf /usr/local/share/fonts/ms_fonts/

Es funktioniert gut im Terminal, aber wenn ich versuche, dies in ein Shell-Skript ( .sh) einzufügen, erhalte ich die Fehlermeldung:

mv: cannot stat '/home/vaishnavi/Downloads/*.ttf': No such file or directory

In diesem Fall möchte ich einfach alle Dateien verschieben .ttfund .ttceingeben /usr/local/share/fonts/ms_fonts/. Ehrlich gesagt bin ich nicht so Experte für Shell-Skripte. Bitte erklären Sie mir, was ich falsch gemacht habe und auch eine Alternative, um meine erwarteten Ergebnisse zu erzielen.

Mein Beispielskript:

sudo mv /home/vaishnavi/Downloads/*.ttc /home/vaishnavi/Downloads/*.ttf /usr/local/share/fonts/ms_fonts/  
...

exit 0

Antworten

3 glennjackman Oct 14 2020 at 19:32

Sie erhalten diesen Fehler, wenn dort keine * .ttf-Dateien vorhanden sind. Wenn keine Dateien mit einem Glob-Muster übereinstimmen, bleibt das Muster selbst standardmäßig im Befehl. Schalten Sie dies mit der Bash- nullglobShell-Option aus

Um ein bisschen sicherer zu sein, stellen Sie sicher, dass tatsächlich einige Dateien verschoben werden müssen:

#!/usr/bin/env bash
...
shopt -s nullglob
# store files in an array
files=( /home/vaishnavi/Downloads/*.{ttc,ttf} )
# and if the array is not empty, move the files.
if (( ${#files[@]} > 0 )); then sudo mv -t /usr/local/share/fonts/ms_fonts/ "${files[@]}" 
fi