
Angenommen, ich möchte mehrere Befehle mit ähnlichen Flags ausführen, wie etwa:
du -sh / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
tar cvf archive / --exclude=dir1 --exclude=dir2 --exclude=dir3/dir4
Ich möchte die --exclude
Flag-Sequenz wiederverwenden und den Code übersichtlicher gestalten, indem ich diese Flags beispielsweise in einer Variablen speichere.
Die obigen Befehle sehen also folgendermaßen aus:
du -sh / "$EFLAGS"
tar cvf archive / "$EFLAGS"
Beachten Sie, dass tar
Dateien und Verzeichnisse relativ zum angegebenen Verzeichnis ausgeschlossen sind.
Was ist die beste und sauberste Lösung?
Hintergrund
Ich möchte mein System mit Tar sichern und einige Verzeichnisse ausschließen, die ich nicht benötige.
Antwort1
Sie können Folgendes versuchen:
$ echo -e / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
/ --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
$ echo !!:3-$
echo --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
--exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
Hier verwenden wir bash
die Verlaufserweiterung:
!!
siehe den letzten Befehl3-$
siehe 3. Parameter bis zum letzten
bash
Sie sollten in Ihrem Skript die Funktionen zur Verlaufserweiterung aktivieren , die in der nicht interaktiven Shell deaktiviert sind:
set -o history
set -o histexpand
Antwort2
In Bash besteht eine sehr saubere Möglichkeit darin, Arrays zu verwenden:
myflags=( --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4 )
tar cvf archive / "${myflags[@]}"
Sie können mit Leerzeichen und anderen lustigen Zeichen umgehen:
myflags=( "--exclude=/a dir/with spaces" $'--exclude=/a dir/with\nnewlines' )
tar cvf archive / "${myflags[@]}"
Sie können auch gefälscht sein, wenn Sie beispielsweise alle Unterverzeichnisse des Verzeichnisses ausschließen möchten /this/one
, die den Buchstaben enthalten g
:
exclude_dirs=( /this/one/*g* )
myflags=( "${exclude_dirs[@]/#/--exclude=}" )
tar cvf archive / "${myflags[@]}"
Antwort3
Ich hätte dies als Kommentar hinzugefügt, aber ich habe noch nicht herausgefunden, wie man Kommentare gut formatiert!
Wie dem auch sei, ich glaube, Sie haben 90 % des Weges geschafft. Versuchen Sie:-
EFLAGS="--exclude=/dir1 --exclude=/dir2"
du -sh / $EFLAGS
tar cvf archive / $EFLAGS
Anführungszeichen sind in der ersten Zeile erforderlich, da diese Leerzeichen enthält.
Keine Anführungszeichen bei Verwendung der Variablen, sodass die Argumente bei Leerzeichen getrennt werden.
Wenn die ausgeschlossenen Verzeichnisnamen Leerzeichen enthalten, müssen Sie diese maskieren.